指的字典序最小或者最大的...对于某个字符串来说通过循环移位得到的就是同构..
int minmaxstring(char *s,bool bMin=true)
{
int i = 0, j = 1, k = 0, l = strlen(s), sub;
while (i<l && j<l && k<l)
{
sub = s[(i+k)%l] - s[(j+k)%l];
if (sub == 0)
k++;
else
{
if (bMin?sub > 0:sub < 0)
i += k+1;
else
j += k+1;
if (i == j)
j++;
k = 0;
}
}
return i<j?i:j;
}
manacher模板
#include"cstdio"
#include"iostream"
#include"cstring"
#include"algorithm"
#define N 110005
using namespace std;
char a[N],b[N*2];
int rad[N*2]; // rad[i]代表以i为中心的最大回文半径
int main()
{
while(scanf("%s",&a[1])!=-1){ //以下标1读入方便使用
int maxl,maxid,id;
int i,len;
for(i=1;a[i];i++){ // 插入'#' 使得所有回文串为奇数
b[i*2]=a[i];
b[i*2+1]='#';
}
len=2*i;b[0]='?'; b[1]='#'; b[len]='\0'; // 防越界 头尾区别
maxid=id=0;
maxl=0;
for(i=1;i<len;i++){
if(maxid>i) rad[i]=min(rad[2*id-i],maxid-i); // 利用对称性优化复杂度
else rad[i]=1;
while(b[i-rad[i]]==b[i+rad[i]]){ //对于当前点 搜索半径
rad[i]++;
}
if(rad[i]+i>maxid){
maxid=rad[i]+i;
id=i;
}
if(rad[i]>maxl) maxl=rad[i];
}
printf("%d\n",maxl-1);
}
}