这道题剥干净后其实就是求循环节,然后上kmp就可以了
(以前真没想到,kmp的代码量那么小
#include <bits/stdc++.h>
using namespace std;
char s[1001000];
int nxt[1001000];
void get_nxt(){
nxt[0] = 0;
nxt[1] = 0;
int m = strlen(s);
for(int i = 1; i < m; i ++){
int j = nxt[i];
while(j && s[i] != s[j])
j = nxt[j];
nxt[i + 1] = s[i] == s[j] ? j + 1 : 0;
}
}
int main(){
scanf("%s", s);
get_nxt();
int n = strlen(s);
int x = n - nxt[n];
if(n % x != 0){
printf("%d\n", n);
//cout << n << endl;
for(int i = 0; i < n; i ++){
printf("1 %d\n", i);
//cout << "1 " << i << endl;
}
}
else{
printf("%d\n", x);
//cout << x << endl;
for(int i = 0; i < x; i ++){
printf("%d", n / x);
//cout << n / x;
for(int j = i; j < n; j += x){
printf(" %d", j);
//cout << ' ' << j;
}
printf("\n");
//cout << endl;
}
}
return 0;
}