2018牛客多校第三场e

这道题剥干净后其实就是求循环节,然后上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;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/81505926
今日推荐