HDU 3374 String Problem (KMP+最小最大表示)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=3374
【题目大意】
给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量。
【题解】
最小最大表示可以用最小最大表示法解决,数量则可以发现就是该字符串的循环节,可以用nxt数组求解。
【代码】
#include <cstring> #include <cstdio> #include <algorithm> const int N=1000010; using namespace std; int nxt[N],i,k,j,t,n,size,ans; char s[N]; void get_nxt(int n,char*a){ int i,j; for(nxt[0]=j=-1,i=1;i<n;nxt[i++]=j){ while(~j&&a[j+1]!=a[i])j=nxt[j]; if(a[j+1]==a[i])j++; } } int min_max_express(char *s,int len,bool flag){ int i=0,j=1,k=0; while(i<len&&j<len&&k<len){ int t=s[(j+k)%len]-s[(i+k)%len]; if(t==0)k++; else{ if(flag){if(t>0)j+=k+1;else i+=k+1;} else{if(t>0)i+=k+1;else j+=k+1;} if(i==j)j++;k=0; } }return min(i,j); } int main(){ while(~scanf("%s",s)){ n=strlen(s); get_nxt(n,s); if(n%(n-1-nxt[n-1])==0)size=n-1-nxt[n-1]; else size=n; ans=n/size; int mi=min_max_express(s,n,1),mx=min_max_express(s,n,0); printf("%d %d %d %d\n",mi+1,ans,mx+1,ans); }return 0; }
愿你出走半生,归来仍是少年