记录编号 |
382344 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 2004] L语言 |
最终得分 |
100 |
用户昵称 |
Go灬Fire |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.585 s |
提交时间 |
2017-03-13 19:18:12 |
内存使用 |
2.32 MiB |
显示代码纯文本
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=300;
const int maxlen=1050000;
int ch[maxn][26],fail[maxn],RT,cnt;
int n,m;
char s[maxlen];
int val[maxn],last[maxn];
inline void Insert(){
scanf("%s",s);
int len=strlen(s),p=RT;
for(int i=0;i<len;i++){
int c=s[i]-'a';
if(!ch[p][c])ch[p][c]=++cnt;
p=ch[p][c];
}
val[p]=len;
}
inline void Build(){
static int q[maxn],Head,Tail;
Head=Tail=0;
for(int i=0;i<26;i++)
if(ch[RT][i]) q[Tail++]=ch[RT][i];
while(Head^Tail){
int x=q[Head++];
for(int i=0;i<26;i++){
if(!ch[x][i]){
ch[x][i]=ch[fail[x]][i];
continue;
}
int j=ch[fail[x]][i];
int tmp=ch[x][i];
fail[tmp]=j;q[Tail++]=tmp;
if(val[j])last[tmp]=j;
else last[tmp]=last[j];
}
}
}
bool f[maxlen];
inline void Update(int x,int i){
while(x){
f[i]|=f[i-val[x]];
x=fail[x];
}
}
inline void Query(){
memset(f,0,sizeof(f));
scanf("%s",s+1);
int len=strlen(s+1),p=RT;
int Max=0;
f[0]=true;
for(int i=1;i<=len;i++) {
f[i]=0;
int c=s[i]-'a';
p=ch[p][c];
f[i]|=f[i-val[p]];
if(val[p])Update(p,i);
else Update(last[p],i);
if(f[i])Max=i;
}
printf("%d\n",Max);
}
inline void Init();
int main(){
freopen("language.in","r",stdin);freopen("language.out","w",stdout);
Init();
getchar();getchar();
return 0;
}
inline void Init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) Insert();
Build();
for(int i=1;i<=m;i++) Query();
}