把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解 P6491 [COCI2010-2011#6] ABECEDA

传送门

分析

两个字符大小关系不变,并且具有传递性,我们可以联想到拓扑排序来解决。

因此,我们就通过字符串的大小关系,推断出一些字符的大小关系,然后拓扑排序即可。

#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;
}
posted @ 2024-01-31 20:34  djh0314  阅读(28)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end