AC自动机,最后一个点错了,不知道为什么
查看原帖
AC自动机,最后一个点错了,不知道为什么
557927
Chen小阳啊楼主2022/10/4 11:07
using namespace std;
struct node{
	int vis[26];
	int end;
	int fail;
};
int cnt;
int pd[100010];
node ac[100010];
void insert(string s){
	int p=0;
	int len=s.size();
	for(int i=0;i<len;i++){
		int c=s[i]-'A';
		if(!ac[p].vis[c]){
			ac[p].vis[c]=++cnt;
		}
		p=ac[p].vis[c];
	}
	ac[p].end=len;
}
void create(){
	queue<int>q;
	for(int i=0;i<26;i++){
		if(ac[0].vis[i]){
			q.push(ac[0].vis[i]);
			ac[ac[0].vis[i]].fail=0;
		}
	}
	while(!q.empty()){
		int p=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			if(ac[p].vis[i]){
				ac[ac[p].vis[i]].fail=ac[ac[p].fail].vis[i];
				q.push(ac[p].vis[i]);
			}
			else {
				ac[p].vis[i]=ac[ac[p].fail].vis[i];
			}
		}
	}
}
void ask(string s){
	pd[0]=1;
	int p=0;
	int len=s.size();
//	cout<<len<<endl;
	for(int i=1;i<=len-1;i++){
		int c=s[i]-'A';
		p=ac[p].vis[c];
		for(int t=p;t&&!pd[i];t=ac[t].fail){
		//		cout<<i<<' '<<i-ac[t].end<<endl;
				if(ac[t].end)pd[i]+=pd[i-ac[t].end];
		}
	}
	for(int i=len-1;i>=0;i--){
		if(pd[i]){
			cout<<i<<endl;
			return ;
		}
	}
	
}
string t;
int main(){
	string s;
	while(114514){
		cin>>s;
		if(s==".")break;
		//s=' '+s;
		insert(s);
	}
	while(cin>>s){
		t+=s;
	}
	t=' '+t;
	create();
	ask(t);
} 
2022/10/4 11:07
加载中...