我是直接暴力建边然后跑一边拓扑序就ok了
因为数组开小了RE,WA了好几发。。
#include<iostream>
#include<sstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<math.h>
#include<map>
#include<time.h>
#include<set>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
#define inf 0x7fffffff
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define max_n 200005
#define mod 10000007
#define LL long long
vector<int>G[max_n];
bool use[max_n];
bool usenum[max_n];
bool useedge[105][105];
int num[max_n];
char s[105][1050];
int n;
int T=0;
bool flag;
void init()
{
flag=1;
memset(useedge,0,sizeof(useedge));
memset(usenum,0,sizeof(usenum));
memset(use,0,sizeof(use));
memset(num,0,sizeof(num));
for(int i=0;i<=104;i++)
G[i].clear();
}
void add(int s,int v)
{
G[s].push_back(v);
num[v]++;
usenum[s]=usenum[v]=1;
}
bool u[105];
void addedge(int k,int t)
{
memset(u,false,sizeof(u));
if(k>=t) return ;
for(int i=0;i<strlen(s[k]);i++)
{
for(int j=k+1;j<=t;j++)
{
if(i>=strlen(s[j]))
{
if(u[j])
flag=0;
continue;
}
if(i==0)
{
if(s[k][i]==s[j][i])u[j]=1;
else
{
if(!useedge[s[k][i]-'a'][s[j][i]-'a'])
{
add(s[k][i]-'a',s[j][i]-'a');
useedge[s[k][i]-'a'][s[j][i]-'a']=1;
}
u[j]=0;
}
}
else
{
if(!u[j])continue;
if(s[k][i]==s[j][i])u[j]=1;
else
{
if(!useedge[s[k][i]-'a'][s[j][i]-'a'])
{
add(s[k][i]-'a',s[j][i]-'a');
useedge[s[k][i]-'a'][s[j][i]-'a']=1;
}
u[j]=0;
}
}
}
}
addedge(k+1,t);
}
void solve()
{
int t=26;
vector<char>ds;
ds.clear();
while(t--)
{
int index=-1;
/*
for(int i=0;i<26;i++)
printf(" num [%d] == %d \n",i,num[i]);
system("pause");
*/
for(int i=0;i<26;i++)
{
if(!use[i] && num[i]==0 && usenum[i])
{
index=i;
use[i]=true;
ds.push_back(index+'a');
break;
}
}
if(index==-1)break;
for(int i=0;i<G[index].size();i++)
{
int w=G[index][i];
num[w]--;
}
}
int res=0;
for(int i=0;i<26;i++)
{
if(usenum[i])res++;
}
if(ds.size()!=res)flag=0;
if(!flag)
{
printf("Impossible\n");
}
else
{
for(int i=0;i<26;i++)
{
if(!use[i])
ds.push_back(i+'a');
}
for(int i=0;i<ds.size();i++)
printf("%c",ds[i]);
printf("\n");
}
}
int main()
{
while(~scanf("%d",&n))
{
init();
for(int i=0;i<n;i++)
scanf("%s",s[i]);
addedge(0,n-1);
solve();
}
return 0;
}