麻了
查看原帖
麻了
167279
Danno0v0楼主2022/10/8 11:48

复杂度应该是对的单次询问线性那么为什么过不了呢

#include<bits/stdc++.h>
using namespace std;
struct trie
{
	int son[26],end,fail,depth,C;
}Ac[1000001];
int cnt;
int n,m;
int fi[1000001],nx[1000001],to[1000001],tot;
string a,b;
void link(int a,int b)
{
	nx[++tot]=fi[a];
	fi[a]=tot;
	to[tot]=b;
}
void Add(string a)
{
	int now=0;
	for(int i=0;i<a.length();i++)
	{
		if(!Ac[now].son[a[i]-'a'])
			Ac[now].son[a[i]-'a']=++cnt,Ac[Ac[now].son[a[i]-'a']].depth=Ac[now].depth+1;
		now=Ac[now].son[a[i]-'a'];
	}
	Ac[now].end=1;
}
void Getfail()
{
	queue<int>que;
	for(int i=0;i<26;i++)
		if(Ac[0].son[i])
			que.push(Ac[0].son[i]);
	while(!que.empty())
	{
		int x=que.front();
		que.pop();
		for(int i=0;i<26;i++)
		{
			if(Ac[x].son[i])
				Ac[Ac[x].son[i]].fail=Ac[Ac[x].fail].son[i],que.push(Ac[x].son[i]);
			else
				Ac[x].son[i]=Ac[Ac[x].fail].son[i];
		}
	}
}
void Dfs(int x,int fa)
{
	if(Ac[x].end)
		Ac[x].C|=(1<<(Ac[x].depth);
	for(int i=fi[x];i;i=nx[i])
	{
		int v=to[i];
		if(v!=fa)
			Ac[v].C|=Ac[x].C,Dfs(v,x);
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a,Add(a);
	Getfail();
	for(int i=0;i<=cnt;i++)
		link(Ac[i].fail,i);
	Dfs(0,0);
	for(int i=1;i<=m;i++)
	{
		int now=0,maxx=0,rr=1;
		cin>>b;
		for(int i=0;i<b.length();i++)
		{
			rr<<=1;
			now=Ac[now].son[b[i]-'a'];
			if(rr&Ac[now].C)
				rr|=1,maxx=max(i+1,maxx);
		}
		cout<<maxx<<endl;
	}
}
2022/10/8 11:48
加载中...