最小表示法

 题目链接:https://cn.vjudge.net/problem/POJ-1509

最小表示法:判断头尾详解的字符串最小的字典序是从第几个字符串开始的。

具体思路:线性的,我们设立两个下表,然后设立一个变量len。

首先令i=0,j=1,len=0;

一开始,我们比较s[i+len]和s[j+len],如果相等的话,就让len++。

如果s[i+len]>s[j+len],我们可以直接让i移到i+len+1,因为在i->i+len这段区间里,都不会使得获得的字符串最小。

如果s[i+len]<s[j+len],我们可以让j移动到j+len+1,这样的话,在j->j+len这段区间里,也都不会使得获得的字符串字典序最小。

https://blog.csdn.net/qq_37369394/article/details/78418391

AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 const int maxn  =2e5+10;
 5 char str[maxn];
 6 int get_min()
 7 {
 8     int len=strlen(str);
 9     int i=0,j=1,k=0;
10     while(i<len&&j<len&&k<len)
11     {
12         int t=str[(i+k)%len]-str[(j+k)%len];
13       //  cout<<t<<endl;
14         if(t==0)
15             k++;
16         else
17         {
18             if(t>0)
19             {
20                 i+=k+1;
21             }
22             else
23             {
24                 j+=k+1;
25             }
26             if(i==j)j++;
27             k=0;
28         }
29     }
30     return min(i,j);
31 }
32 int main()
33 {
34     int T;
35     scanf("%d",&T);
36     while(T--)
37     {
38         scanf("%s",str);
39         int ans=get_min()+1;
40         printf("%d\n",ans);
41     }
42     return 0;
43 }
44  

 

posted @ 2018-12-28 09:51  Let_Life_Stop  阅读(177)  评论(0编辑  收藏  举报