56分求助
查看原帖
56分求助
463210
zzzYheng楼主2021/7/13 09:48
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
const int LEN=2e6+10;
int n;
char s[MAXN],t[LEN];
int trie[MAXN][30],End[MAXN],cnt;
int fail[MAXN];
int edge[MAXN*2][2],head[MAXN],len;
int val[MAXN];
void insert(char s[],int len,int id)
{
	int i,j,now=0;
	for(i=1;i<=len;i++)
	{
		int c=s[i]-'a';
		if(trie[now][c]==0)
			trie[now][c]=++cnt;
		now=trie[now][c];
	}
	End[id]=now;
}
void add(int x,int y)
{
	len++;
	edge[len][0]=x;
	edge[len][1]=head[y];
	head[y]=len;
}
queue<int> q;
void build()
{
	int i,j;
	for(i=0;i<26;i++)
		if(trie[0][i]!=0)
			q.push(trie[0][i]);
	while(!q.empty())
	{
		int x=q.front(); q.pop();
		for(i=0;i<26;i++)
		{
			if(trie[x][i]!=0)
			{
				fail[trie[x][i]]=trie[fail[x]][i];
				q.push(trie[x][i]);
				add(trie[x][i],trie[fail[x]][i]);
			}
			else
				trie[x][i]=trie[fail[x]][i];
		}
	}
}
void query(int x)
{
	int i,j;
	for(i=head[x];i;i=edge[i][1])
	{
		query(edge[i][0]);
		val[x]+=val[edge[i][0]];
	}
}
int main()
{
	int i,j,now=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%s",s+1);
		insert(s,strlen(s+1),i);
	}
    build();
	scanf("%s",t+1);
	int tmp=strlen(t+1);
	for(i=1;i<=tmp;i++)
	{
		int c=t[i]-'a';
		now=trie[now][c];
		val[now]++;
	}
	query(1);
	for(i=1;i<=n;i++)
		printf("%d\n",val[End[i]]);
	return 0;
}
2021/7/13 09:48
加载中...