题意:将字符串第i位开始的字串提到前面形成A[i],求n个这种串中字典序最小的串的i。
题解:1、暴力可以水过。。
2、最小表示法,具体参见IOI2003论文《最小表示法在字符串循环同构问题中的应用》。
View Code
1 #include<cstdio> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int T; 8 for(scanf("%d",&T),getchar();T;T--) 9 { 10 char ss[10005]; 11 gets(ss); 12 string st=ss,ans=ss,tp; 13 int len=st.size(),id=1; 14 for(int i=1;i<len;i++) 15 { 16 tp=st.substr(i,len-i)+st.substr(0,i); 17 if(tp<ans) 18 { 19 ans=tp; 20 id=i+1; 21 } 22 } 23 printf("%d\n",id); 24 } 25 return 0; 26 }
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int solve(char s[]) 6 { 7 int x,y,i=0,j=1,k=0,id=0,len=strlen(s); 8 while(i<len&&j<len&&k<len) 9 { 10 x=(i+k)%len; 11 y=(j+k)%len; 12 if(s[x]>s[y]) 13 i=i+k+1,k=0; 14 else if(s[x]<s[y]) 15 j=j+k+1,k=0; 16 else 17 k++; 18 if(i==j) 19 j++; 20 } 21 return min(i,j)+1; 22 } 23 int main() 24 { 25 int T; 26 for(scanf("%d",&T),getchar();T;T--) 27 { 28 char ss[10005]; 29 gets(ss); 30 printf("%d\n",solve(ss)); 31 } 32 return 0; 33 }