本机运行没问题,交上去TLE
查看原帖
本机运行没问题,交上去TLE
371136
渔歌楼主2021/2/20 11:24

我人傻了

#include<cstdio>
#include<cstring>
#include<queue>
#define N 500010
using namespace std;
queue<int>q;
char t[2*N];
int trie[N][26],fail[N],end[N],ch,n;
void insert(){
	int k=strlen(t),i=0,j=0;
	for(;i<k;i++){
		if(!trie[j][t[i]-'a'])trie[j][t[i]-'a']=ch++;
		j=trie[j][t[i]-'a'];
	}
	end[j]++;
}
void build(){
	for(int i=0;i<26;i++)if(trie[0][i])q.push(trie[0][i]);
	int k;
	while(!q.empty()){
		k=q.front();q.pop();
		for(int i=0;i<26;i++){
			if(trie[k][i]){
				fail[trie[k][i]]=trie[fail[k]][i];
				q.push(trie[k][i]);
			}
			else trie[k][i]=trie[fail[k]][i];
		}
	}
}
int Ans(){
	int ans=0,k=strlen(t),j=0;
	for(int i=0;i<k;i++){
		j=trie[j][t[i]-'a'];
		for(int l=j;end[l]!=-1&&j;l=end[l]){ans+=end[l];end[l]=-1;}
	}
	return ans;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%s",t);
		insert();
	}
	scanf("%s",t);
	build();
	printf("%d",Ans());
	return 0;
}
2021/2/20 11:24
加载中...