zoukankan      html  css  js  c++  java
  • 【最小表示法】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 }
  • 相关阅读:
    强连通分量(Kosaraju)
    拓扑排序
    树状数组BIT
    差分
    RMQ(ST表)
    LCA(Tarjan)
    LCA(ST倍增)
    海亮SC2019 树上数数(转载)
    海亮SC
    【十二省联考2019】异或粽子/可持久化01trie
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/5779116.html
Copyright © 2011-2022 走看看