题意:按序给你一些字符串,要你输出它们的字典序
思路:根据前后两个字符串第一个不同的字符来确定有向关系建图,拓扑排序就行了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <stack>
using namespace std;
int main()
{
string str1,str2;
cin>>str1;
if(str1=="#") return 0;
vector<int> gl[30];
map<char,int> mp;
char mp2[30];
int in[30]= {0};
int pos=1,cou=0;
while(cin>>str2&&str2!="#")
{
cou++;
int cur=0,l=min(str1.size(),str2.size());
while(cur<l&&str1[cur]==str2[cur]) cur++;
if(cur<l)
{
char a=str1[cur],b=str2[cur];
if(!mp[a])
{
mp[a]=pos++;
mp2[mp[a]]=a;
}
if(!mp[b])
{
mp[b]=pos++;
mp2[mp[b]]=b;
}
int x=mp[a],y=mp[b];
if(gl[x].end()==find(gl[x].begin(),gl[x].end(),y))
{
in[y]++;
gl[x].push_back(y);
}
}
str1=str2;
}
stack<int> sk;
for(int i=1; i<pos; ++i)
if(!in[i]) sk.push(i);
while(!sk.empty())
{
int gettop=sk.top();
sk.pop();
printf("%c",mp2[gettop]);
for(int i=0; i<gl[gettop].size(); ++i)
{
in[gl[gettop][i]]--;
if(!in[gl[gettop][i]])
sk.push(gl[gettop][i]);
}
}
if(!cou) printf("%c",str1[0]);
printf("\n");
return 0;
}