题意:
问一个串最长前缀,使其能被分成若干个字典树上的串。
题解:
简单的dp+trie。
将trie建好,每个点暴力匹配转移就好了。
我SB贡献三发RE。
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
struct trnode{
int a[27];
bool tail;
trnode(){tail=false;}
}tr[1010];int root=1,tot=1;
int n,m;
char s[2000010];
int f[2000010];
void build()
{
int len=strlen(s+1);
int x=root;
for(int i=1;i<=len;i++)
{
int c=s[i]-'a';
if(tr[x].a[c]) x=tr[x].a[c];
else x=tr[x].a[c]=++tot;
}
tr[x].tail=true;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
build();
}
while(m--)
{
scanf("%s",s+1);
int len=strlen(s+1);
memset(f,0,sizeof(f));
for(int i=len;i>=1;i--)
{
int x=root;
for(int j=i;j<=len;j++)
{
int c=s[j]-'a';
if(!tr[x].a[c]) break;
x=tr[x].a[c];
if(tr[x].tail)
f[i]=max(f[i],(j-i+1)+f[j+1]);
}
}
printf("%d\n",f[1]);
}
}