CSU 1800: 小X的标题(KMP匹配)
【摘要】
题目:
Description
小X梦中得到一个神秘字符串,醒来后他赶快记了下来。
这个字符串大概是一篇晦涩难懂的文章,姑且不用去管他的含义,小X想给它起一个标题来表示这份天书。
但是小X是起名困难户,于是他找到了小Y和小Z来一起商量。
小X觉得,标题是这个字符串的开头一段和结尾一段就行,简单、直观;而小Y觉得,一个好的标...
题目:
Description
小X梦中得到一个神秘字符串,醒来后他赶快记了下来。
这个字符串大概是一篇晦涩难懂的文章,姑且不用去管他的含义,小X想给它起一个标题来表示这份天书。
但是小X是起名困难户,于是他找到了小Y和小Z来一起商量。
小X觉得,标题是这个字符串的开头一段和结尾一段就行,简单、直观;而小Y觉得,一个好的标题应该还在文章中间的某一个地方出现过,除了开头和结尾部分;小Z和小Y的看法一样,不过小Z希望他自己在文章中找到的标题出现的位置和小Y找到的位置不一样。
如果有多个标题符合要求,他们一致同意采用最长的那个。
你知道他们最后采用了哪个吗?
代码:
-
#include<iostream>
-
#include<stdio.h>
-
#include<string.h>
-
using namespace std;
-
-
char c[500005];
-
int nextt[500005];
-
-
void getnext(char *t, int m)
-
{
-
int i = 1, j = 0;
-
nextt[0] = nextt[1] = 0;
-
while (i<m)
-
{
-
if (j == 0 || t[i] == t[j])nextt[++i] = ++j;
-
else j = nextt[j];
-
}
-
}
-
-
int main()
-
{
-
while (scanf("%s", c + 1) != EOF)
-
{
-
int l = strlen(c + 1);
-
getnext(c, l);
-
int d = nextt[l], sum = 0;
-
while (d>0 && c[d] != c[l])d = nextt[d];
-
while (d)
-
{
-
sum = 0;
-
int i = 2, j = 1;
-
while (i <= l)
-
{
-
if (j == 0)i++, j++;
-
else if (c[i] == c[j])
-
{
-
i++, j++;
-
if (j > d)
-
{
-
sum++, i--, j--;
-
j = nextt[j];
-
}
-
}
-
else j = nextt[j];
-
}
-
if (sum >= 3)break;
-
d = nextt[d];
-
while (d>0 && c[d] != c[l])d = nextt[d];
-
}
-
if (sum >= 3)for (int i = 1; i <= d; i++)printf("%c", c[i]);
-
else printf("Cannot find it");
-
printf("\n");
-
}
-
return 0;
-
}
附上自己调试时用的测试用例:
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)