【最小表示法】BZOJ2176-Strange string(unsigned char!!!)
2016-08-17 11:00
127 查看
【题目大意】
给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的SS的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串。
【思路】
裸最小表示法。
注意要用unsigned char(!!)char能表示-128~127, unsigned char没有符号位,因此能表示0~255。
给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的SS的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串。
【思路】
裸最小表示法。
注意要用unsigned char(!!)char能表示-128~127, unsigned char没有符号位,因此能表示0~255。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=10000000+50; unsigned char str[MAXN*2]; int n; void init() { scanf("%d",&n); scanf("%s",str); for (int i=0;i<n;i++) str[i+n]=str[i]; } void solve() { int i=0,j=1,k=0; while (i<2*n && j<2*n && k<n) { int t=str[(i+k)%(2*n)]-str[(j+k)%(2*n)]; if (!t) k++; else { if (t>0) i+=k+1; else j+=k+1; if (i==j) j++; k=0; } } for (int r=0;r<n;r++) printf("%c",str[(r+i)%(2*n)]); } int main() { init(); solve(); return 0; }
相关文章推荐
- BZOJ 2176 Strange string 最小表示法
- BZOJ 2176 Strange string ——最小表示法
- BZOJ 2176 Strange String (最小表示法)
- BZOJ 2176 Strange string 最小表示法
- bzoj2176 Strange string 最小表示法
- BZOJ 2176: Strange string 最小表示法
- bzoj 2176: Strange string 字符串最小表示法
- BZOJ 2176: Strange string【字符串最小表示法
- bzoj2882 工艺【最小表示法】
- 【BZOJ2882】【字符串的最小表示】工艺
- bzoj4484[JSOI2015]最小表示
- [BZOJ 2176]Strange string
- BZOJ 2882 后缀数组/最小表示法 解题报告
- BZOJ 4484: [Jsoi2015]最小表示 拓扑排序 bitset
- bzoj 4484: [Jsoi2015]最小表示
- bzoj 4484 [Jsoi2015] 最小表示 solution
- BZOJ 2882 工艺 字典序最小的循环同构串(最小表示法 详解)
- Bzoj4484 [Jsoi2015]最小表示
- 【BZOJ2882】工艺【最小表示法】
- bzoj2882 工艺(后缀自动机(最小表示法))