传送门。
分析
两个字符大小关系不变,并且具有传递性,我们可以联想到拓扑排序来解决。
因此,我们就通过字符串的大小关系,推断出一些字符的大小关系,然后拓扑排序即可。
#include <bits/stdc++.h>
#include <vector>
#include <string>
#include <queue>
//#define int long long
using namespace std;
const int N = 1e5+5;
int n, m,top;
int d[N];
char st[N];
string s[N];
vector<int > lj[N];
bool vis[N];
inline void end1() {
cout<<"?";
exit(0);
}
inline void endd2() {
cout<<"!";
exit(0);
}
inline void fc(string s,string t) {
int len=min(s.size(),t.size());
for(int i=0; i<len; ++i) {
if(s[i]==t[i]) continue;
d[t[i]]++;
lj[s[i]].push_back(t[i]);
return ;
}
if(s.size()>t.size()) endd2();
return ;
}
signed main() {
cin>>n;
for(int i=1; i<=n; ++i) {
cin>>s[i];
for(int j=0; j<s[i].size(); ++j) vis[s[i][j]]=1;
}
for(int i=1; i<n; ++i) for(int j=i+1; j<=n; ++j) fc(s[i],s[j]);
queue<int > q;
for(int i='a'; i<='z'; ++i) if(vis[i]&&!d[i]) q.push(i);
// for(int i='a';i<='z';++i) cout<<d[i]<<" ";cout<<endl;
while(!q.empty()) {
int now=q.front();
q.pop();
if(!q.empty()) end1();
st[++top]=now;
for(auto to:lj[now]) if(!(--d[to])) q.push(to);
}
for(int i='a'; i<='z'; ++i) if(vis[i]&&d[i]) endd2();
for(int i=1; i<=top; ++i) cout<<st[i];
return 0;
}
标签:int,题解,long,COCI2010,P6491,include,2011
From: https://www.cnblogs.com/djh0314/p/18000085