#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int N = 111111; int topo[205]; struct node { char a[105]; }e[105]; int n; int g[30][30]; int f[30]; int main() { scanf("%d",&n); int i,j; for(i = 0; i < n; i++) { scanf("%s",e[i].a); } memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); for(i = 1; i < n;i++) { int l1 = strlen( e[i].a); int l2 = strlen(e[i-1].a); for(j = 0; j < l1&& j < l2; j++) { if(e[i].a[j] != e[i-1].a[j]) { int x = e[i].a[j] - ‘a‘; int y = e[i-1].a[j] - ‘a‘; if(g[x][y] == 0) f[y]++; g[x][y] = 1; break; } } if(l1 < l2 && j == l1) { printf("Impossible\n"); return 0; } } queue<int> q; for(i = 0; i < 26; i++) { if(f[i] == 0) { q.push(i); } } int cnt = 0; while(!q.empty()) { int w = q.front(); q.pop(); topo[cnt++] = w; for(i = 0; i < 26; i++) { if(g[w][i] == 1) { f[i]--; if(f[i] == 0) q.push(i); } } } if(cnt != 26) { printf("Impossible\n"); return 0; } for(i = cnt-1; i >=0; i--) { printf("%c",topo[i] + ‘a‘); } printf("\n"); return 0; }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char name[120][120]; int mat[30][30]; int mark[30]; int topo[30]; int vis[30]; int cnt; int main() { int n; int i,j,k; while(scanf("%d",&n)!=EOF) { memset(mat,0,sizeof(mat)); memset(mark,0,sizeof(mark)); cnt=0;k=0; int ok=1; for(i=1;i<=n;i++) { scanf("%s",name[i]); } for(i=1;i<n;i++) { if(ok==0) break; int len1=strlen(name[i]); int len2=strlen(name[i+1]); for(j=0;j<len1&&j<len2;j++) { if(name[i][j]!=name[i+1][j]) { int x=name[i][j]-‘a‘; int y=name[i+1][j]-‘a‘; if(mat[x][y]==0) { mat[x][y]=1; mark[y]++; } break; } } if(len1>len2&&j==len2) { ok=0; } } for(i=0;i<26;i++) { int flag=-1; for(j=0;j<26;j++) { if(mark[j]==0) { topo[k++]=j; mark[j]=-1; flag=j; break; } } if(flag!=-1) { for(j=0;j<26;j++) { if(mat[flag][j]==1) { mark[j]--; } } } } if(k<26) ok=0; if(ok) { for(i=0;i<26;i++) { printf("%c",topo[i]+‘a‘); } printf("\n"); } else printf("Impossible\n"); } return 0; }
时间: 2024-10-12 15:20:48