当前位置: 代码迷 >> 综合 >> LA - 3026 - Period(KMP)
  详细解决方案

LA - 3026 - Period(KMP)

热度:8   发布时间:2024-01-10 13:43:26.0

题意:求一个字符串每个前缀的最短循环节,输出前缀i的长度和循环节的长度。

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=13&page=show_problem&problem=1027

——>>第一道KMP题目……照汝佳的书敲下……

#include <cstdio>using namespace std;const int maxn = 1000000 + 10;
char P[maxn];
int f[maxn];int main()
{int n, kase = 0;while(scanf("%d", &n) == 1 && n){scanf("%s", P);f[0] = 0;f[1] = 0;for(int i = 1; i < n; i++){int j = f[i];while(j && P[i] != P[j]) j = f[j];f[i+1] = (P[i] == P[j] ? j+1 : 0);}printf("Test case #%d\n", ++kase);for(int i = 2; i <= n; i++)if(f[i] > 0 && i % (i-f[i]) == 0) printf("%d %d\n", i, i/(i-f[i]));printf("\n");}return 0;
}


  相关解决方案