Description
Solution
我好菜啊
首先可以用T建trie,我们把每个串经过的节点插入它的序号,那么查询的时候就在trie上走然后查询最长全0即可
于是我十分sb地写了trie上的线段树合并这个在线带修改做法,十分sb地测一发极限刚好1.5s,十分sb地卡空间和常数,十分sb地拿了暴力分
注意到我们是按顺序插入串的序号的,因此只需要记录此节点上一个序号与之比较即可。由于数据随机甚至可以遍历子树乱搞A
欲哭无泪
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int N=5000005;
int rec[N][3],last[N],ans[N],tot=1,n;
char str[N];
void ins(char *str,int id) {
int len=strlen(str+1),now=1;
rep(i,1,len) {
if (!rec[now][str[i]-'a']) rec[now][str[i]-'a']=++tot;
now=rec[now][str[i]-'a'];
ans[now]=std:: max(ans[now],id-last[now]-1);
last[now]=id;
}
}
int ask(char *str) {
int len=strlen(str+1),now=1;
rep(i,1,len) now=rec[now][str[i]-'a'];
return std:: max(ans[now],n-last[now]);
}
int main(void) {
freopen("data.in","r",stdin);
freopen("myp.out","w",stdout);
int m; scanf("%d%d",&n,&m); ans[0]=n;
rep(i,1,n) {
scanf("%s",str+1);
ins(str,i);
}
rep(i,1,m) {
scanf("%s",str+1);
printf("%d\n", ask(str));
}
return 0;
}