记录编号 382344 评测结果 AAAAAAAAAA
题目名称 [HNOI 2004] L语言 最终得分 100
用户昵称 GravatarGo灬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();
}