KMP理解以后这种题很水。不解释。
LA题目链接
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[1000006]; int f[1000006]; int n; void getfail(char *s) { f[0] = f[1] = 0; for(int i = 1; i < n; i++) { int j = f[i]; while(j && s[i] != s[j]) j = f[j]; if(s[i] == s[j]) j++; f[i+1] = j; } } int main() { int i, j, cas = 1; while( ~scanf("%d", &n) && n) { scanf("%s", s); getfail(s); printf("Test case #%d\n", cas++); for(i = 2; i <= n; i++) { if(f[i] > 0 && i % (i - f[i]) == 0) printf("%d %d\n", i, i / (i - f[i])); } puts(""); } return 0; }