您的位置:首页 > 其它

HDU 3374 String Problem(字符串最小表示+KMP )

2013-04-17 22:51 363 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374

题意:求字符串的最小最大表示位置以及循环节个数。

思路:循环节是KMP的。

char s
;
int next
,len;

void getNext(char s[],int len,int next[])
{
next[0]=-1;
int i=0,j=-1;
while(i<len)
{
if(j==-1||s[i]==s[j]) next[++i]=++j;
else j=next[j];
}
}

//flag=1,返回最小表示位置
//flag=0,返回最大表示位置
int cal(char *s,int len,int flag)
{
int i=0,j=1,k=0,t;
while(i<len&&j<len&&k<len)
{
t=s[(j+k)%len]-s[(i+k)%len];
if(t==0) k++;
else
{
if(flag) t>0?j+=k+1:i+=k+1;
else t>0?i+=k+1:j+=k+1;
if(i==j) j++;
k=0;
}
}
return min(i,j);
}

int main()
{
while(gets(s))
{
len=strlen(s); getNext(s,len,next);
int cnt,x=len-next[len];
if(len%x==0) cnt=len/x;
else cnt=1;
int Min=cal(s,len,1);
int Max=cal(s,len,0);
printf("%d %d %d %d\n",Min+1,cnt,Max+1,cnt);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: