【最小表示法】BZOJ2176-Strange string(unsigned char!!!)

【题目大意】

给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的SS的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串。

【思路】

裸最小表示法。

注意要用unsigned char(!!)char能表示-128~127, unsigned char没有符号位,因此能表示0~255。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAXN=10000000+50;
 7 unsigned char str[MAXN*2];
 8 int n;
 9 
10 void init()
11 {
12     scanf("%d",&n);
13     scanf("%s",str);
14     for (int i=0;i<n;i++) str[i+n]=str[i];
15 }
16 
17 void solve()
18 {
19     int i=0,j=1,k=0;
20     while (i<2*n && j<2*n && k<n)
21     {
22         int t=str[(i+k)%(2*n)]-str[(j+k)%(2*n)];
23         if (!t) k++;
24             else
25             {    
26                 if (t>0) i+=k+1;
27                     else j+=k+1;
28                 if (i==j) j++;
29                 k=0; 
30             }
31     }
32     
33     for (int r=0;r<n;r++)
34         printf("%c",str[(r+i)%(2*n)]);
35 }
36 
37 int main()
38 {
39     init();
40     solve();
41     return 0;
42 }
原文地址:https://www.cnblogs.com/iiyiyi/p/5779116.html