您的位置:首页 > 其它

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

2013-01-27 14:56 417 查看
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=232

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

思路:最大表示法。

const int N=150005;
int n,m,visit
,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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: