hdu3374 String Problem

来源:互联网 发布:淘宝首页装修视频教程 编辑:程序博客网 时间:2024/04/30 00:41

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374


题解:循环移位,找字典序最前的和字典序最后的下标标号,然后把次数也输出来。

用最小表示法和最大表示法找到字典序最小和最大的字符串。用kmp计算出现的次数(最小循环周期)。

//http://blog.csdn.net/coraline_m/article/details/9834619


#include <stdio.h>#include <string.h>#define MAXN 1000002char str1[MAXN];int next[MAXN],len;void getNext(){int i=0,j=-1;next[0]=-1;while(str1[i]!='\0'){if(j==-1||str1[i]==str1[j]){i++;j++;next[i]=j;}elsej=next[j];}}int getMin()//最小表示法{int i=0,k=0,j=1,t;while(i<len&&j<len&&k<len){t=str1[(i+k)%len]-str1[(j+k)%len];if(!t)k++;else{if(t>0)i+=(k+1);elsej+=(k+1);if(i==j)j++;k=0;}}return i<j?i:j;}int getMax()//最大表示法{int i=0,k=0,j=1,t;while(i<len&&j<len&&k<len){t=str1[(i+k)%len]-str1[(j+k)%len];if(!t)k++;else{if(t>0)j+=(k+1);elsei+=(k+1);if(i==j)j++;k=0;}}return i<j?i:j;}int main(){int cnt,temp;while(scanf("%s",str1)!=EOF){len=strlen(str1);getNext();temp=len-next[len];cnt=1;if(len%temp==0)cnt=len/temp;printf("%d %d %d %d\n",getMin()+1,cnt,getMax()+1,cnt);}return 0;}



原创粉丝点击