社区讨论

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 条回复,欢迎继续交流。

正在加载回复...