题目:
题解:
挺暴力的AC自动机......
f[i]表示从 0 - i 可以涵盖单词
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int m,n,ch[205][30],tot=0,f[1000001];
char st[1000001];
bool is_end[1000001];
void cl()
{
scanf("%s",st);
int l=strlen(st);
int now=0;
for (int i=0;i<l;i++)
{
int x=st[i]-'a';
if (!ch[now][x]) ch[now][x]=++tot;
now=ch[now][x];
}
is_end[now]=true;
}
void ac(int m,int v)
{
int ans=0;
f[0]=v;
for (int i=0;i<=m;i++)
{
if (f[i]!=v) continue;
int now=0;
for (int j=i+1;j<=m;j++)
{
int x=st[j]-'a';
if (!ch[now][x]) break;
now=ch[now][x];
if (is_end[now]) ans=max(ans,j),f[j]=v;
}
}
printf("%d\n",ans);
}
int main()
{
int i;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
cl();
for (i=1;i<=m;i++)
{
scanf("%s",st+1);
ac(strlen(st+1),i);
}
}