POJ 1509

题意:将字符串第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 }

 

你可能感兴趣的:(poj)