本文主要是介绍LA - 3026 - Period(KMP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:求一个字符串每个前缀的最短循环节,输出前缀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;
}
这篇关于LA - 3026 - Period(KMP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!