UVALive 3026(KMP)

来源:互联网 发布:linux集群与自动化运维 编辑:程序博客网 时间:2024/06/06 05:17


题意:求前缀最短循环节点,周期大于1


题解:使用KMP的fail数组性质,如果i%fail[i]==0那么这里就是一个最短循环节点,i/fail[i]为循环子串长度




#include<iostream>#include<cstdio>#include<cstring>#define N int(1e6+5)char s[N];int fail[N];void getfail(char *p, int *f){f[0] = f[1] = 0;for (int i = 1; p[i]; i++){int j = f[i];while (j&&p[i] != p[j])j = f[j];f[i + 1] = p[i] == p[j] ? j + 1 : 0;}}int main(){#ifdef CDZSCfreopen("i.txt", "r",stdin);#endifint n,cas=0;while (~scanf("%d%s", &n,s)&&n){getfail(s, fail);int m = strlen(s);printf("Test case #%d\n", ++cas);for (int i = 2; i <= m; i++){int x = i - fail[i];if (i%x == 0&&i/x>1){printf("%d %d\n", i, i / x);}}puts("");}return 0;}




0 0
原创粉丝点击