HDU-3374 String Problem (最小最大表示法)
题意:给定一个字符串,循环移动找到最小(大)字典序下标,以及该串的循环节个数。
思路:循环移动匹配字典序最大,或者循环截取 (TLE). 最后还是投降去看了别人的题解... 然后就是一道 字符串中循环的最小(大)的表示法 题。然后关于循环节个数当然就用next数组来求
完整代码:
#include<iostream> #include<set> #include<map> #include<vector> #include<string> #include <cstring> #include<algorithm> using namespace std; const int maxn = 1e6+9; int nex[maxn]; int len ; string s; void getnext(){ int i = 0,j=-1; nex[i] = j; while(i<len){ if(j==-1||s[i]==s[j]){ nex[++i] = ++j; }else j = nex[j]; } } int getM(int 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(cin>>s){ len = s.size(); int ans,ansmax,ansmin; getnext(); ansmax = getM(0)+1; ansmin = getM(1)+1; //有循环节就输出循环节个数,否则输出1 if(!(len%(len-nex[len]))){ ans = len/(len-nex[len]); }else ans = 1; cout<<ansmin<<" "<<ans<<" "<<ansmax<<" "<<ans<<endl; } }