能否 AC 自动机 / RE 求调
查看原帖
能否 AC 自动机 / RE 求调
662425
Ivan422楼主2025/1/21 11:22

从 CF25E 来的,TLE 了

//2022tysc0819
#include<bits/stdc++.h>
//#include<bits/extc++.h>
using namespace std;
//using namespace __gnu_pbds;
//#define arr array<int,3>
//#define int long long
//#define pb push_back
//#define double long double
//#define map unordered_map
//#pragma GCC optimize(2,3,"Ofast","inline")
const int N=2e6+10,M=1<<3+1,P=1e9+7,MOD=998244353;
const double PI=3.1415926,EPS=0.00001;
int n,nxt[N][26],fail[N],ed[N],rt,cnt,loa[M*N],trc;
int dp[N];
char res[M*N];
bool vis[N][M];
void insert(string s,int id){
	int p=rt;
	for(auto v:s){
		if(!nxt[p][v-'a'])nxt[p][v-'a']=++cnt;
		p=nxt[p][v-'a'];
	}
	dp[p]|=(1<<id-1);
	ed[p]++;
}
queue<int>q;
queue<pair<int,int> >qq;
void getf(){
	for(int i=0;i<26;i++)if(nxt[rt][i])q.push(nxt[rt][i]);
	while(q.size()){
		int f=q.front();q.pop();
		for(int i=0;i<26;i++){
			int p=nxt[f][i];
			if(!p)nxt[f][i]=nxt[fail[f]][i];
			else{
				fail[p]=nxt[fail[f]][i];
				dp[p]|=dp[nxt[fail[f]][i]];
				q.push(p);
			}
		}
	}
}
string s[N],ans;
signed main(){
	while(cin>>s[1]){
		for(int i=0;i<=cnt;i++){
			fail[i]=dp[i]=0;
			for(int j=0;j<8;j++)vis[i][j]=0;
			for(int j=0;j<26;j++)nxt[i][j]=0;
		}
		n=3;
		insert(s[1],1);
		for(int i=2;i<=n;i++){
			cin>>s[i];
			insert(s[i],i);
		}
		getf();
		while(qq.size())qq.pop();
		qq.push({0,0});
		int p=0;trc=0;
		vis[0][0]=1;
		while(qq.size()){
			pair<int,int>f=qq.front();qq.pop();
			if(f.second==(1<<n)-1){
				ans="";
				while(p){
					ans+=res[p];
					p=loa[p];
				}
				reverse(ans.begin(),ans.end());
				cout<<ans.size()<<"\n";
				goto nxt;
			}
			for(int i=0;i<26;i++)if(
				!vis[nxt[f.first][i]]
					[f.second|dp[nxt[f.first][i]]]
			){
				vis[nxt[f.first][i]]
				   [f.second|dp[nxt[f.first][i]]]=1;
				qq.push({
					nxt[f.first][i],
					f.second|dp[nxt[f.first][i]]
				});
				++trc;
				loa[trc]=p;
				res[trc]=char(i+'a');
			}
			++p;
		}
		nxt:;
	}
    return 0;
}
//note:

2025/1/21 11:22
加载中...