CodeForces 510C Fox And Names
阿新 • • 發佈:2018-12-31
一道拓撲排序題!!
注意判斷各種情況,兩個字串比較的時候,從左向右開始比較,當出現不同的字母后,不再向後比較。一個是另一個的字首,那麼長的在後面。
當給出的順序出現環的時候,或者有串的字首在串的後面時,出現錯誤。
#include<stdio.h> #include<string.h> #include<algorithm> #include<vector> char a[1001][1001]; int in[10001],v[1001][101],cnt; char b[1001]; using namespace std; int topsort() { int t1,t2,i,j; for(i=0;i<26;i++) { for(j=0;j<26;j++) { if(in[j]==0) { t1=j; in[j]=-1; break; } } if(j==26) return 0; b[cnt++]=j+'a'; for(j=0;j<26;j++) { if(v[t1][j]) { in[j]--; } } } return 1; } int main() { int i,j,m,n,l; while(~scanf("%d",&n)) { cnt=0; memset(v,0,sizeof(v)); memset(in,0,sizeof(in)); for(i=0;i<n;i++) { scanf("%s",a[i]); } for(i=0;i<n-1;i++) { int f=0; int l1=strlen(a[i]); int l2=strlen(a[i+1]); for(j=0;j<min(l1,l2);j++) { if(a[i][j]!=a[i+1][j]) { f=1; int t1=a[i][j]-'a'; int t2=a[i+1][j]-'a'; if(!v[t1][t2]) { in[t2]++; v[t1][t2]=1; } break; } } if(l2<l1&&f==0) { printf("Impossible\n"); return 0; } } if(topsort()) puts(b); else puts("Impossible"); } return 0; }