项链游戏
[无link]
现给出一个字符串,它为一个环,可以从任意位置分开后顺时针构成一个整数,求构造的最大整数是多少?
对于该问题,我们在遍历更新的时候,如果比较了大于1次才得出大小关系,我们应该从最后一次比较的位置继续,反之,应该从第一次比较的下一个位置继续比较。
对于该策略证明:
1 如果只比较一次,显然
2 如果比较了k次,证明两个串前k个元素是相同的,第k+1个元素不同,那么我选择1-k-1中任何一个位置开始比较,答案都不会更优,因为如果新串第K+1个元素更大,那么显然K+1个元素会大于1-k的元素,那么显然以k+1开头更有可能更优,如果第K+1个元素更小,那么显然从中间截出来的串甚至比新串还小。
#include<string.h>
#include<stdio.h>
char s[2000006];
int ans;
int main(){
gets(s);
int l=strlen(s);
strcat(s,s);
for(int i=1;i<l;++i){
for(int j=0;j<l;++j){
if(s[i+j]>s[ans+j]){
ans=i;
if(j==0) break;
else {
i=i+j-1;
break;
}
}
if(s[i+j]<s[ans+j]){
if(j==0) break;
else {
i=i+j-1;
break;
}
}
if(j==l-1) goto A;
}
}
A:
for(int i=0;i<l;++i)
putchar(s[ans+i]);
return 0;
}