http://codeforces.com/problemset/problem/510/C
按照给出的许多行字符串,顺序代表字典序大小,需要你去重组26个字母的大小顺序来符合给出的字符串的字典序大小关系
对于每2个字符串,只要找到第一对相同位置不同内容的字符,然后连一条边表示大小关系。每次处理完一对字符串,再用
弗洛伊德来处理一下图。
当然还有一些细节问题需要注意。
对于矛盾的情况也很容易想到。
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
char a[111][111];
bool vis[33][33];
int ru[33];
int ma[33][33];
int flag=0;
while(cin>>n)
{
memset(ma,0,sizeof(ma));
memset(ru,0,sizeof(ru));
flag=0;
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
{
char t1,t2;
int zz=0;
int l=min(strlen(a[i-1]),strlen(a[i]));
while(zz<l)
{
if(a[i][zz]!=a[i-1][zz])
{
t1=a[i-1][zz];
t2=a[i][zz];
break;
}
zz++;
}
if(zz>=l)
{
if(strlen(a[i-1])>strlen(a[i]))
{
flag=1;
break;
}
continue;
}
if(flag)
break;
for(int i=0;i<26;i++)
{
for(int j=0;j<26;j++)
{
for(int k=0;k<26;k++)
{
if(vis[j][i]==1&&vis[i][k]==1)
vis[j][k]=1;
}
}
}
if(vis[t2-'a'][t1-'a']==1)
{
flag=1;
break;
}
else{
vis[t1-'a'][t2-'a']=1;
if(ma[t1-'a'][t2-'a']==0)
ma[t1-'a'][t2-'a']=1,ru[t2-'a']++;
}
}
int js=26;
if(flag)
{
cout<<"Impossible"<<endl;
continue;
}
while(js>0)
{
int mi,id;
for(int i=0;i<26;i++)
{
if(ru[i]==0)
{
mi=ru[i];
id=i;
break;
}
}
char ans='a'+id;
ru[id]=999999999;
cout<<ans;
for(int i=0;i<26;i++)
{
if(ma[id][i]==1&&ru[i]>0)
{
ru[i]--;
}
}
js--;
}
cout<<endl;
}
return 0;
}