【最小表示法】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 }