这题只是简单的KMP 算法。 只是有一点需要注意的就是当最后一个的大小是 len % (len - next[len])不够除的时候, 要直接判断是1, 不用继续计算。其他的就是裸的求next
View Code
#include<stdio.h> #include<string.h> #define maxn 1000008 int next[maxn]; char sift[maxn]; int n; void get_next() { int len = strlen(sift); int i = 0, j = -1; next[0] = -1; while (i <= len ) { if (j == -1 || sift[j] == sift[i]) { i ++; j ++; next[i] = j; } else { j = next[j]; } } if (len % (len - next[len]) == 0) { printf("%d\n", len / (len - next[len])); } else { printf("1\n"); } return; } int main() { while (scanf("%s", sift) != EOF) { if (sift[0] == '.') { break; } get_next(); } return 0; }