题意:给若干行按了一定顺序的单词序列,输出这些单词字母按了什么顺序
思路,每俩行肯定最多只能得到一组字母的优先级;
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
#include<vector>
using namespace std;
char str[10010][30];
int len[100010];
int ls;
vector<int>e[27];
bool vis[27]; // 标记那些字母出现过
int dep[27];
char ans[30];
void bfs(){
int la=0;
queue<int>que;
for(int i=0;i<26;i++)
if(vis[i]&&dep[i]==0){
que.push(i);
ans[la++]=i+'A';
}
vector<int>::iterator it;
while(!que.empty()){
int cur=que.front();que.pop();
for(it=e[cur].begin();it!=e[cur].end();it++)
{
dep[*it]--;
if(dep[*it]==0){
que.push(*it);
ans[la++]=*it+'A';
}
}
}
for(int i=0;i<la;i++) printf("%c",ans[i]);
printf("\n");
}
int main()
{
// freopen("in.in","r",stdin);
ls=-1;
memset(vis,0,sizeof(vis));
while(1){
scanf("%s",str[++ls]);
if(str[ls][0]=='#') {ls--;break;}
len[ls]=strlen(str[ls]);
for(int i=0;i<len[ls];i++) vis[str[ls][i]-'A']=1;
}
for(int i=0;i<27;i++) e[i].clear();
memset(dep,0,sizeof(dep));
for(int i=0;i<ls;i++){
int l=min(len[i],len[i+1]);
int st=0;
while(st<l){
if(str[i][st]==str[i+1][st]) st++;
else break;
}
if(st>=l) continue;
else{
e[str[i][st]-'A'].push_back(str[i+1][st]-'A');
dep[str[i+1][st]-'A']++;
}
}
bfs();
return 0;
}