社区讨论

求调

P6491 [COCI 2010/2011 #6] ABECEDA参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m3yncswi
此快照首次捕获于
2024/11/27 00:03
去年
此快照最后确认于
2025/11/04 13:50
4 个月前
查看原帖
样例全过,提交全 RE
CPP
#include<iostream>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<random>
#include<chrono>
#include<queue> 
using namespace std;
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
typedef long long LL;
const int N=1000;
int n;
string s[20];
int mp[N][N],din[N],dout[N],st[N];
int ans[N],cnt;
struct Trie{
	int idx=1;
	queue<int>q;
	struct node{
		int s[30],cnt[30],ed;
	}tr[N*20];
	bool insert(string a){
		int p=1;
		for(int i=0;i<a.length();i++){
			int x=a[i]-'a'+1;
			st[x]=1;
			if(!tr[p].s[x])tr[p].s[x]=++idx;
			tr[p].cnt[x]++;
			p=tr[p].s[x];
			if(tr[p].ed)return 1;
		}
		tr[p].ed++;
		return 0;
	}
	void del(string a){
		int p=1;
		for(int i=0;i<a.length();i++){
			int x=a[i]-'a'+1,last=p;
			tr[p].cnt[x]--;
			p=tr[p].s[x];
			if(!tr[last].cnt[x])tr[last].s[x]=0;
		}
		tr[p].ed--;
	}
	void build(string a){
		int p=1;
		for(int i=0;i<a.length();i++){
			int x=a[i]-'a'+1;
			for(int j=1;j<=26;j++){
				if(!tr[p].s[j]||j==x||mp[x][j])continue;
				mp[x][j]=1;
				din[j]++;
				dout[x]++;
			}
			p=tr[p].s[x];
		}
	}
	int check(){
		int f=0;
		for(int i=1;i<=n;i++){
			build(s[i]);
			del(s[i]);
		}
		int sum=0,tot=0;
		for(int i=1;i<=26;i++){
			if(!din[i]&&dout[i])q.push(i);
			if(din[i]||dout[i])sum++;
			tot+=st[i];
		}
		if(q.size()==1)f=1;
		while(q.size()){
			auto ver=q.front();q.pop();
			ans[++cnt]=ver;
			for(int j=1;j<=26;j++){
				if(!mp[ver][j]||j==ver)continue;
				din[j]--;
				if(!din[j])q.push(j);
			}
		}
		if(cnt<sum)return -1;
		return f&&cnt==tot;
	}
}trie;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>s[i];
	for(int i=1;i<=n;i++){
		if(trie.insert(s[i])){
			cout<<"!";
			return 0;
		}
	}
	int f=trie.check();
	if(f==1)for(int i=1;i<=cnt;i++)cout<<char(ans[i]+97-1);
	else if(f==-1)cout<<"!";
	else cout<<"?";
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...