SGU 232 Infinite Fraction(字符串的最大表示)

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=232

题意:给出n,m,以及长度为n的原字符串S[0,n-1]。根据S构造出新的n个字符串A[n],A[i][j]=S[(i+j*m)%n]。求A中最大的串。

思路:最大表示法。







const int N=150005;

int n,m,visit[N],cnt;

string s,p;



string ans;



int minRepresention(string s)

{

    int i=0,j=1,k=0,t,L=s.length();

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

    {

        t=s[(i+k)%L]-s[(j+k)%L];

        if(t==0) k++;

        else if(t<0) i+=k+1,k=0;

        else j+=k+1,k=0;

        if(i==j) j++;

    }

    return min(i,j);

}



int main()

{

    RD(n,m);

    RD(s);

    ans="";

    int L=s.length(),i,j,k;

    for(i=0;i<L;i++) if(!visit[i])

    {

        p="";

        cnt++;

        j=i;

        while(visit[j]!=cnt)

        {

            visit[j]=cnt;

            p+=s[j];

            j=(j+m)%n;

        }

        int pos=minRepresention(p);

        int len=p.length();

        p=p+p;

        string temp=p.substr(pos,len);

        if(ans==""||ans<temp) ans=temp;

    }

    while(ans.length()<n)

    {

        int det=n-ans.length();

        det=min(det,ans.length());

        ans=ans+ans.substr(0,det);

    }

    PR(ans);

    return 0;

}

  

你可能感兴趣的:(action)