【uva-200】Rare Order(拓撲排序過的第一道)
阿新 • • 發佈:2018-12-16
題目大意:
輸入一堆按新的字母排序從小到大排好的字串,#作為結束。
求新的字母排序規則。
思路:
不知道一共多少組所以兩個兩個比較咯。
注意dfs第一個得到的是最小的字母。
是反序的要用stack倒著輸出。
/* uva 200 by zhuhua Time limit: 3000 ms AC Time: 0 ms??? */ #include <iostream> #include <string> #include <cstring> #include <algorithm> #include <vector> #include <stack> #include <map> using namespace std; vector <int> C[30]; vector <int> tot; stack <int> output; bool visit[30]; bool exist[30]; void doit(string s1,string s2) { int len1,len2,len; int x,y; len1=s1.length(); len2=s2.length(); len=min(len1,len2); for(int i=0;i<len;i++) { if(s1[i]!=s2[i]) { x=s1[i]-'A'; y=s2[i]-'A'; C[x].push_back(y); if(!exist[x]) {tot.push_back(x);exist[x]=true;} if(!exist[y]) {tot.push_back(y);exist[y]=true;} break; } } } void dfs(int x) { visit[x]=true; for(int i=0;i<C[x].size();i++) { int next=C[x][i]; if(!visit[next]) dfs(next); } output.push(x); } int main() { int i=0; while(i<26) {C[i].clear();i++;} tot.clear(); while(!output.empty()) output.pop(); memset(visit,0,sizeof(visit)); memset(exist,0,sizeof(exist)); string strpre,str; cin>>strpre; if(strpre=="#")return 0; while(cin>>str) { if(str=="#")break; doit(strpre,str); strpre=str; } for(int i=0;i<tot.size();i++) { int now=tot[i]; if(!visit[now]) { dfs(now); } } while(!output.empty()) { char out=output.top()+'A'; cout<<out; output.pop(); }cout<<endl; return 0; }