CSU 1800: 小X的标题(KMP匹配)

举报
用户已注销 发表于 2021/11/19 04:59:00 2021/11/19
【摘要】 题目: Description 小X梦中得到一个神秘字符串,醒来后他赶快记了下来。 这个字符串大概是一篇晦涩难懂的文章,姑且不用去管他的含义,小X想给它起一个标题来表示这份天书。 但是小X是起名困难户,于是他找到了小Y和小Z来一起商量。 小X觉得,标题是这个字符串的开头一段和结尾一段就行,简单、直观;而小Y觉得,一个好的标...

题目:

Description

小X梦中得到一个神秘字符串,醒来后他赶快记了下来。

这个字符串大概是一篇晦涩难懂的文章,姑且不用去管他的含义,小X想给它起一个标题来表示这份天书。

但是小X是起名困难户,于是他找到了小Y和小Z来一起商量。

小X觉得,标题是这个字符串的开头一段和结尾一段就行,简单、直观;而小Y觉得,一个好的标题应该还在文章中间的某一个地方出现过,除了开头和结尾部分;小Z和小Y的看法一样,不过小Z希望他自己在文章中找到的标题出现的位置和小Y找到的位置不一样。

如果有多个标题符合要求,他们一致同意采用最长的那个。

你知道他们最后采用了哪个吗?

Input

不超过20组数据。

对于每组数据,输入一行一个字符串表示文章内容,字符串只由小写英文字母构成,每个字符串长度不超过500000。

Output

对于每组数据,输出一行一个字符串表示最终选用的标题;如果找不到合适的标题,输出一行一个字符串“Cannot find it”。

Sample Input

aaa
aaaaa
abacadaeafa
fixprefixsuffixsowhatisfix

Sample Output

Cannot find it
aa
a
fix

Hint

aa是aaaaa的前缀以及后缀,另外,把字符串从1到5标号,小Y可以在位置2~3处找到一个aa,而小Z可以在另一个位置3~4处找到一个aa。


代码:


  
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. char c[500005];
  6. int nextt[500005];
  7. void getnext(char *t, int m)
  8. {
  9. int i = 1, j = 0;
  10. nextt[0] = nextt[1] = 0;
  11. while (i<m)
  12. {
  13. if (j == 0 || t[i] == t[j])nextt[++i] = ++j;
  14. else j = nextt[j];
  15. }
  16. }
  17. int main()
  18. {
  19. while (scanf("%s", c + 1) != EOF)
  20. {
  21. int l = strlen(c + 1);
  22. getnext(c, l);
  23. int d = nextt[l], sum = 0;
  24. while (d>0 && c[d] != c[l])d = nextt[d];
  25. while (d)
  26. {
  27. sum = 0;
  28. int i = 2, j = 1;
  29. while (i <= l)
  30. {
  31. if (j == 0)i++, j++;
  32. else if (c[i] == c[j])
  33. {
  34. i++, j++;
  35. if (j > d)
  36. {
  37. sum++, i--, j--;
  38. j = nextt[j];
  39. }
  40. }
  41. else j = nextt[j];
  42. }
  43. if (sum >= 3)break;
  44. d = nextt[d];
  45. while (d>0 && c[d] != c[l])d = nextt[d];
  46. }
  47. if (sum >= 3)for (int i = 1; i <= d; i++)printf("%c", c[i]);
  48. else printf("Cannot find it");
  49. printf("\n");
  50. }
  51. return 0;
  52. }

附上自己调试时用的测试用例:

a
aa
aaa
aba
ababab
abababa
abababab
abababcab
ababacbab
aaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaab
aaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaa
aaaabaaaabaaaabaaaa
aaaabaaaabaaaabaaaabaaaa
aaaabaaaabaaaabaa

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/79692807

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。