牛客网 [编程题]字符串计数 kmp

缘起

日常浪费生命~ 牛客网 [编程题]字符串计数

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
给定一个仅由小写字母组成且长度不超过1e6的字符串,将首字符移到末尾并记录所得的字符串,不断重复该操作,虽
然记录了无限个字符串,但其中不同字符串的数目却是有限的,那么一共记录了多少个不同的字符串?


输入描述:
输入给定的字符串。


输出描述:
输出记录的不同字符串的数目。
示例1
输入
abab
输出
2
说明
记录了abab和baba这2个不同的字符串。

一开始傻逼还没反应过来这是求字符串循环节问题. 知道了这道题就好简单了~ 其实不就是求循环节的长度么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//#include "stdafx.h"
#include <stdio.h>
#include <string.h>
//#define LOCAL

const int maxn = 1e6+5;
int n, next[maxn],sz;
char p[maxn];

void makenext()
{
next[1] = 0;
for (int i = 2,k;i<=n+1;i++)
{
k = next[i-1];
while(k && p[i-1]!=p[k])
{
k = next[k];
}
next[i] = k+1;
}
}

int main() {
#ifdef LOCAL
freopen("d:\\data.in", "r", stdin);
// freopen("d:\\my.out", "w", stdout);
#endif
scanf("%s",p+1);
n = strlen(p+1);
makenext();
sz = n-next[n+1]+1;
if (sz==n || n%sz)
{
printf("%d\n", n);
}
else
{
printf("%d\n", sz);
}
return 0;
}

ac情况

1
答案正确:恭喜!您提交的程序通过了所有的测试用例

参考

【1】https://yfsyfs.github.io/2019/10/23/poj-2406-Power-Strings-KMP/