您的位置:首页 > 其它

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: