網易互娛2017實習生招聘線上筆試第一場-2原始碼編譯
http://hihocoder.com/contest/ntest2016spring1/problem/2
拓撲排序
處理一下字串
沒什麼好說的。。
時間限制:10000ms
單點時限:1000ms
記憶體限制:256MB
描述:
在網易遊戲的日常工作中,C++ 是一門常用的語言。面對眾多的 C++ 程式碼,等待原始檔編譯的漫長時間是個令人糟心的時刻,一直以來大家對此怨聲載道。終於有一天,大家找到了你,一位優秀的程式設計師,請你來幫忙分析一下編譯速度的瓶頸。
經過一番調查和研究,你發現一些原始碼之間是有依賴關係的。例如,某個原始檔 a.cpp 編譯連結生成了動態連結庫 a.dll,而 b.cpp 編譯連結生成的 b.dll 依賴於 a.dll。這個時候,必須等待 a.dll 生成之後才能生成 b.dll。為了表達簡單,我們這個時候稱 b.cpp 依賴於 a.cpp。
為了驗證這個想法,你決定著手通過程式碼分析這些檔案之間的編譯順序。已知這些檔案的檔名,以及這些檔案所依賴的其他檔案,你需要編寫一個程式,輸出一個可行的編譯所有原始檔的編譯順序。如果有多種可行的序列,請輸出所有檔名序列中字典序最小的那一個(序列 (a1, a2, ..., an) 字典序小於序列 (b1, b2, ..., bn),當且僅當存在某個 i ,使得 ai 的字典序小於 bi,並且對於任意 j < i ,都有 aj = bj)。
輸入:
輸入包含多組測試資料。
輸入的第一行包含一個整數 T(T ≤ 100),表示輸入中一共包含有 T 組測試資料。
每組測試資料第一行是一個整數 N(N ≤ 1000),表示一共有 N 個原始碼檔案。隨後一共有 N 行資料,其中第 i(0 ≤ i < N) 行資料包含序號為 i 的原始碼檔案的依賴資訊。每一行開頭是一個字串,表示這一個檔案的檔名,隨後一個整數 m(0 ≤ m ≤ N),表示編譯這個原始檔之前需要先編譯 m 個依賴檔案。之後是 m 個整數 j0 ... jm-1,表示這 m 個依賴檔案的序號(0 ≤ j < N) 。所有的檔名僅由小寫字母、數字或“.”組成,並且不會超過 10 個字元。保證 n 個原始碼檔案的檔名互不相同。
輸出:
對於每一組輸入,按照編譯先後順序輸出一組可行的編譯順序,一行一個檔名。如果有多種可行的序列,請輸出所有檔名序列中字典序最小的那一個。如果不存在可行的編譯順序,輸出一行 ERROR。每組測試資料末尾輸出一個空行。
樣例輸入
3
2
a.cpp 0
b.cpp 1 0
2
cb 0
c 0
2
a.cpp 1 1
b.cpp 1 0
樣例輸出
a.cpp
b.cpp
c
cb
ERROR
#include<iostream>
#include<string.h>
#include<string>
#include<queue>
#include<map>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define mst(k,j) memset(k,j,sizeof(k))
#define MAXN 1002
struct cmp{
bool operator()(string a,string b)
{
return a>b;
}
};
priority_queue<string,vector<string>,cmp> strlist;
map<string,int> mslist;
map<int,string> milist;
vector<int> vlist[MAXN];
vector<string> ans;
int indx[MAXN];
int n,k,h,g;
string str,str1;
int main(){
int T;
cin>>T;
while(T--){
while(!strlist.empty()){
strlist.pop();
}
mslist.clear();milist.clear();ans.clear();
rep(i,MAXN) vlist[i].clear(); //這幾個clear方法太笨,應該改一下
mst(indx,0);
cin>>n;
rep(i,n){
cin>>str;
cin>>k;
mslist[str]=i;
milist[i]=str;
if(k==0)
strlist.push(str);
else{
rep(j,k){
cin>>h;
vlist[h].push_back(i);
indx[i]++;
}
}
}
h=0;
while(!strlist.empty()){
str=strlist.top();
strlist.pop();
h++;
ans.push_back(str);
k=mslist[str];
rep(i,vlist[k].size()){
g=vlist[k][i];
if(--indx[g]==0){
str1=milist[g];
strlist.push(str1);
}
}
}
if(h==n){
rep(i,n)
cout<<ans[i]<<endl;
cout<<endl;
}
else
cout<<"ERROR"<<endl<<endl;
}
}