社区讨论
求调
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 条回复,欢迎继续交流。
正在加载回复...