样例AC提交RE求助
查看原帖
样例AC提交RE求助
220824
yyz1005楼主2022/7/7 09:33

RT

#include<bits/stdc++.h>
using namespace std;
int n;
char s[1000010],t[1000010];
char trie[1000010][30];
int fail[1000010];
int ncnt[1000010];
int cnt = 0;
void inser(){
	int id = 0;
	int leng = strlen(s);
	for(int i = 0; i < leng; i++){
		if(trie[id][s[i]-'a']) id = trie[id][s[i]-'a'];
		else {
			cnt++;
			trie[id][s[i]-'a'] = cnt;
			id = cnt;
		}
	}
	ncnt[id]++;
}
void buildfail(){
	queue<int> unq;
	fail[0] = 0;
	for(int i = 0; i < 26; i++){
		if(trie[0][i]){
			unq.push(trie[0][i]);
			fail[trie[0][i]] = 0;
		} 
	}
	while(!unq.empty()){
		int fir = unq.front();
		unq.pop();
		for(int i = 0 ; i < 26; i++){
			if(trie[fir][i]){
				fail[trie[fir][i]] = trie[fail[fir]][i];
				unq.push(trie[fir][i]);
			} else {
				trie[fir][i] = trie[fail[fir]][i];
			}
		}
	}
	
}
void query(){
	int id = 0,ans = 0,leng = strlen(t);
	//printf("%s %d\n",t,leng);
	for(int i = 0; i < leng; i++){
		id = trie[id][t[i]-'a'];
		//printf("\n--------\n%d\n",id);
		for(int j = id; j&&ncnt[j]!=-1; j = fail[j]){
			//printf("%d[%d]|",j,ncnt[j]);
			ans+=ncnt[j];
			ncnt[j] = -1;
		}
	}
	printf("%d",ans);
}
int main(){
	//freopen("3808_1.in","r",stdin);
	scanf("%d",&n);
	while(n--){
		scanf("%s", s);
		inser();
	}
	buildfail();
	/*
	for(int i = 0; i <= cnt; i++) printf("%2d|",i);
	puts("");
	for(int i = 0; i <= cnt; i++) printf("%2d|",fail[i]);
	puts("");
	for(int i = 0; i <= cnt; i++) printf("%2d|",ncnt[i]);
	puts("");
	*/
	scanf("%s", t);
	query();
	return 0;
}
2022/7/7 09:33
加载中...