★ 输入文件:fool.in
输出文件:fool.out
简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
从前有一个渔夫抓到了一条特别的鱼,放走了。
渔夫再次抓到了这条鱼,正要再次放走之时,这条鱼吐出了一片迷雾,迷雾散去以后,渔夫不见了。
渔夫睁开眼,发现自己到了一个石碑面前,碑上有一行小写英文字符串S,下面写着:“汝等既有护生之念,应是善良之人,理当授以嘉奖。但是为了证明你的善良,你需要展现你的智慧,以确保吾所见之善良,并非出于汝之愚笨。上面的字符串,你若于其中找到最长的子串,使得这个子串既出现在前缀,又出现在后缀,还出现在字符串的中间,也就是既非前缀又非后缀的位置,则该石碑会将其所藏之物拱手相送。”
渔夫听完以后,可谓一脸懵逼,遂将这个问题分享给你,希望你能够解决。若能解决,渔夫愿意拿出10,000,000,000,000 mod 250 元,作为解决这个问题的报酬。
【输入格式】
第一行是一个数字q,表示这个问题有q组不同问题。
接下来q行每行一个由小写英文字母组成的字符串S,意义见于上文。
【输出格式】
输出共q行,每行一个字符串,表示对于每组问题,所求的字符串,如果不存在长度大于0且满足要求的字符串,就改成输出”---”(不包含引号)
【样例输入】
1 niconiconi
【样例输出】
ni
【提示】
前10%的数据,q<=10,n<=100,m<=1,000
前30%的数据,q<=30,n<=500,m<=15,000
前50%的数据,q<=100,n<=2,000,m<=200,000
所有数据,q<=200,000,n<=100,000,m<=10,000,000
【来源】
QBXT春季训练营第二次测试T3 OR 51nod 1286
kmp的next数组
#include <cstring> #include <cstdio> #define N 10500000 char str[N]; int Next[N],Q,len; inline int Get_next(int L) { int i=0,j=-1; Next[i]=j; for(;i<L;) { if(j==-1||str[i]==str[j]) i++,j++,Next[i]=j; else j=Next[j]; } return j; } int Main() { freopen("fool.in","r",stdin);freopen("fool.out","w",stdout); scanf("%d",&Q); for(;Q--;) { scanf("%s",str); len=strlen(str); int i,k=Get_next(len); for(i=1;i<len;i++) if(Next[i]==k) break; if(i==len) k=Next[k]; if(k==0) {puts("---");continue;} str[k]='