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 }
code

 

以上是关于2017.8.7 联考水题 Passward kmp/hash 字符串的主要内容,如果未能解决你的问题,请参考以下文章

2017.8.7 联考 就 贪心(有反悔策略)

2017.8.7 联考 期望的一个奇怪的题 书

8.7联考题解

[十二省联考2019]春节十二响

多校联考九场总结

NOIP2016提高A组五校联考4总结