社区讨论
40pts求条,玄关
P2322[HNOI2006] 最短母串问题参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mk599r5p
- 此快照首次捕获于
- 2026/01/08 17:39 上个月
- 此快照最后确认于
- 2026/01/10 23:55 上个月
只ac了 #1 #2 #4 # 7 # 9
CPP#include<bits/stdc++.h>
using namespace std;
int n,ans[105],cnt,c[100005],fa[100005],v[10005][5005];
struct A{
int son[30],fail,s;
}a[100005];
string t,s;
queue<int> q;
queue<pair<int,int>> qq;
void get_fail(){
for(int i=1;i<=26;i++)
if(a[0].son[i])
q.push(a[0].son[i]);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=1;i<=26;i++){
if(a[x].son[i]){
a[a[x].son[i]].fail=a[a[x].fail].son[i];
a[a[x].son[i]].s|=a[a[a[x].son[i]].fail].s;
q.push(a[x].son[i]);
}
else a[x].son[i]=a[a[x].fail].son[i];
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
int x=0;
for(int j=0;j<s.size();j++){
if(a[x].son[s[j]-'A'+1]==0) a[x].son[s[j]-'A'+1]=++cnt;
x=a[x].son[s[j]-'A'+1];
}
a[x].s|=1<<(i-1);
}
get_fail();
qq.push({0,0});
v[0][0]=1;
int i=0,ct=0;
while(!qq.empty()){
int x=qq.front().first,y=qq.front().second;
qq.pop();
if(y==(1<<n)-1){
int num=0;
while(i){
c[++num]=ans[i];
i=fa[i];
}
for(int j=num;j>=1;j--) cout<<char(c[j]+'A'-1);
return 0;
}
for(int j=1;j<=26;j++){
if(!v[a[x].son[j]][y|a[a[x].son[j]].s]){
v[a[x].son[j]][y|a[a[x].son[j]].s]=1;
qq.push({a[x].son[j],y|a[a[x].son[j]].s});
fa[++ct]=i;
ans[ct]=j;
}
}
i++;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...