hdu4162_Shape Number

http://acm.hdu.edu.cn/showproblem.php?pid=4162

可参看百度文库 周源(最小表示法)http://wenku.baidu.com/view/0e1a6013a216147917112820.html

题目大意:找出字典序中最小的排列 若通过枚举,绝对超时,参看最小表示法模板

View Code
#include<cstdio>

#include<cstring>

#include<iostream>

using namespace std;



char str[300010];



int Min(char str[],int len)

{

    int i=0,j=1,k=0;

    while(i<len&&j<len&&k<len)

    {

        if(str[i+k]==str[j+k])

            k++;

        else

        {

            if(str[i+k]>str[j+k])

                i+=k+1,j=i+1;

            else

                j+=k+1;

            if(i==j)

                j++;

            k=0;

        }

    }

    return i;

}



int main()

{

    int i,len,t,k;

    while(scanf("%s",str)!=EOF)

    {

        len=strlen(str);

        t=str[0];

        for(i=0;i<len-1;i++)

        {

            str[i]=(str[i+1]-str[i]+8)%8+'0';

        }

        str[i]=(t-str[i]+8)%8+'0';

        k=Min(str,len);

        for(i=k;i<len;i++)

            printf("%c",str[i]);

        for(i=0;i<k;i++)

            printf("%c",str[i]);

        printf("\n");

    }

    return 0;

}

 

你可能感兴趣的:(number)