您的位置:首页 > 其它

HDU 4162 Shape Number (模拟)

2016-05-17 19:55 459 查看
题意:给一个字符串,字符串中的0看作8,然后后一位减去前一位并提前一位,第一位减去最后一位放在最后一位,然后求求得字符串的最小字典序

把紫书上的方法抄下来交上去超时,后来看题解找了一个方法(没注释的)才AC的

代码如下

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<iostream>
using namespace std;
const int maxn=300000+10;
char a[maxn];
char b[maxn];
//int lesss(const char *s,int p,int q,int n)
//{
//    for(int i=0; i<n; i++)
//        if(s[(p+i)%n]!=s[(q+i)%n])
//            return s[(p+i)%n]<s[(q+i)%n];
//    return 0;
//}
int work(int m)
{
int i,j,l;
i=0; j=1;
while(i<m && j<m)
{
for(l=0;l<m;l++)
if(b[(i+l)%m]!=b[(j+l)%m]) break;
if(l>m) break;
if(b[(i+l)%m] > b[(j+l)%m])
i=i+l+1;
else
j=j+l+1;
if(i==j) j=i+1;
}
if(i<j) return i;
return j;
}
int main()
{
while(~scanf("%s",a))
{
int len=strlen(a);
for(int i=0; i<len; i++)
{
if(a[i]=='0') a[i]='8';
if(a[i+1]=='0') a[i+1]='8';
if(i<len-1) b[i]=(8+(a[i+1]-a[i]))%8+'0';
else b[i]=(8+(a[0]-a[i]))%8+'0';
}
int ans=work(len);

//        int n=strlen(a);
//        for(int i=1; i<len; i++)
//            if(lesss(b,i,ans,len)) ans=i;

for(int i=0; i<len; i++)
putchar(b[(i+ans)%len]);
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最小字典序