hdu3374 String Problem 最小最大表示法 最小循环节出现次数

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int nxt[1000005], len;
char a[1000005];
void mknxt(){
	int i=0, j;
	nxt[0] = j = -1;
	while(i<len){
		if(j==-1 || a[i]==a[j])	nxt[++i] = ++j;
		else	j = nxt[j];
	}
}
int getMin(){
	int i=0, j=1, k=0;
	while(i<len && j<len && k<len){
		int t=a[(i+k)%len]-a[(j+k)%len];
		if(!t)	k++;
		else{
			if(t>0)	i += k + 1;
			else	j += k + 1;
			if(i==j)	j++;
			k = 0;
		}
	}
	return min(i, j);
}
int getMax(){
	int i=0, j=1, k=0;
	while(i<len && j<len && k<len){
		int t=a[(i+k)%len]-a[(j+k)%len];
		if(!t)	k++;
		else{
			if(t>0)	j += k + 1;
			else	i += k + 1;
			if(i==j)	j++;
			k = 0;
		}
	}
	return min(i, j);
}
int main(){
	while(scanf("%s", a)!=EOF){
		memset(nxt, 0, sizeof(nxt));
		len = strlen(a);
		mknxt();
		int cnt=len-nxt[len];
		if(len%cnt)	cnt = 1;
		else	cnt = len / cnt;
		printf("%d %d %d %d
", getMin()+1, cnt, getMax()+1, cnt);
	}
}
原文地址:https://www.cnblogs.com/poorpool/p/7906122.html