点击打开链接
//最小(大)表示法+kmp
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
void getnext(char str[],int next[],int t)
{
int i=0,j=next[0]=-1;
while(i<t)
{
if(j==-1||str[i]==str[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
int min_max(char str[],int t,bool flag)
{
int i=0,j=1,k=0;
while(i<t&&j<t&&k<t)
{
int f=str[(j+k)%t]-str[(i+k)%t];
if(!f) k++;
else {
if(f>0) {
if(flag) j=max(i+1,j+k+1);
else i=max(j+1,i+k+1);
}
else {
if(flag) i=max(j+1,i+k+1);
else j=max(i+1,j+k+1);
}
k=0;
}
}
return min(i,j);
}
int main()
{
char str[maxn];
while(scanf("%s",str)==1)
{
int next[maxn];
int t=strlen(str);
getnext(str,next,t);
int m1=min_max(str,t,true); //最小表示法
int m2=min_max(str,t,false); //最大表示法
int f1=t-next[t]; //最小循环节
if(t!=f1&&t%f1==0) printf("%d %d %d %d\n",m1+1,t/f1,m2+1,t/f1);
else printf("%d %d %d %d\n",m1+1,1,m2+1,1);
}
return 0;
}
hdu 3374 最小(大)表示法+kmp
最新推荐文章于 2024-08-05 15:41:47 发布