2017.8.7 联考水题 Passward kmp/hash 字符串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017.8.7 联考水题 Passward kmp/hash 字符串相关的知识,希望对你有一定的参考价值。
你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s。
传说打开庙门的密码是这个字符串的一个子串 t,并且 t 既是 s 的前缀又是 s 的后缀并且还在 s 的中间位置出现过一次。
如果存在这样的串,请你输出这个串,如有多个满足条件的串,输出最长的那一个。
如果不存在这样的串,输出"Just a legend"(去掉引号)。
输入格式:
仅一行,字符串 s。
输出格式:
如题所述
样例输入
fixprefixsuffix
样例输出:
fix
数据范围:
对于 60%的数据, s 的长度<=100
对于 100%的数据, s 的长度<=100000
solution
这个题真是水
但是我第三次 眼瞎?理解错题意?好像都有
出现过一次 与 只出现一次 真的不一样........
明明昨天的总结都说了这个事了...........
那再来个措施吧: 看题的时候全屏看,把字放到最大
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define mem(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 const int N=100066; 7 8 char s[N]; 9 int fail[N],n,len; 10 11 void kmp() 12 { 13 n=strlen(s); 14 fail[0]=0; 15 fail[1]=0; 16 for(int i=2,k=0;i<=n;++i) 17 { 18 while(k&&s[i-1]!=s[k]) 19 k=fail[k]; 20 if(s[i-1]==s[k]) 21 ++k; 22 fail[i]=k; 23 } 24 } 25 26 void match() 27 { 28 int kk=n; 29 int flag=0; 30 while(fail[kk]) 31 { 32 int sum=0; 33 len=fail[kk]; 34 for(int i=0;i<len;++i) 35 s[i]=s[i]; 36 for(int i=1,k=0;i<n-1;++i) 37 { 38 while(k&&s[i]!=s[k]) 39 k=fail[k]; 40 if(s[i]==s[k]) 41 ++k; 42 if(k==len) 43 ++sum; 44 } 45 if(sum) 46 { 47 flag=1; 48 break; 49 } 50 kk=fail[kk]; 51 } 52 if(flag) 53 for(int i=0;i<fail[kk];++i) 54 printf("%c",s[i]); 55 else 56 printf("Just a legend"); 57 } 58 59 int main(){ 60 scanf("%s",s); 61 kmp(); 62 match(); 63 //while(1); 64 return 0; 65 }
以上是关于2017.8.7 联考水题 Passward kmp/hash 字符串的主要内容,如果未能解决你的问题,请参考以下文章