题目大意:
输入一堆按新的字母排序从小到大排好的字符串,#作为结束。
求新的字母排序规则。
思路:
不知道一共多少组所以两个两个比较咯。
注意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;
}