最小表示法

#include<bits/stdc++.h>
using namespace std;

string s;
int i,j,k;
int main()
{
	cin>>s;
	int len=s.length();
	s+=s;
	i=0;j=1;
	while(i<len&&j<len)
	{
		for(k=0;k<len&&s[i+k]==s[j+k];k++);
		if(k==len)
		{
			printf("循环元=");
			for(int q=min(i,j);q<max(i,j);q++)
				printf("%c",s[q]);
			printf("\n");
			j++;
		}
		else
		{
			if(s[i+k]>s[j+k]) i=i+k+1!=j?i+k+1:i+k+2; 
			//s[i~i+k]不是ans
			else j=j+k+1!=i?j+k+1:j+k+2; 
			//=if(s[i+k]<s[j+k]
			//s[j~j+k]不是ans 
		}
	}
	
	int ans=min(i,j);
	printf("循环同构最小表示为:");
	for(i=0;i<len;i++) printf("%c",s[ans+i]);
	
}
posted @ 2020-10-23 20:42  林生。  阅读(40)  评论(0)    收藏  举报