求调
查看原帖
求调
1492534
chengfu86楼主2024/11/27 00:02

样例全过,提交全 RE

#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;
}

2024/11/27 00:02
加载中...