题意:
给你n长度的字符串(保证给出的字符串里不出现回文子串)和p表示可以选择前p个小写字母,问你该字符串字典序的下一个满足不出现任何回文子串的字符串是哪个。
思路:
要保证为下个字典序的串,那么我们必须从后面开始枚举判断,对于当前位置的字符,枚举可以得新字符,由于原串保证不出现回文子串,那么你修改成新的字符可能造成的回文串长度只可能是2或3,即aa或者aba形式,那么你只需要判断下前一个和前两个的字符是否和该字符相同即可确定下个字符串的这一位,接下来还要修改其后面的位,因为该为比其后面的位还要高,所以后面的位可以从第1个小写字母一直枚举到第p个小写字母,一定要从小到大枚举,若该位和前一位前两位的字符不一样及可以,继续枚举下一位。
#include<cstdio>
const int MAX=1005;
char s[MAX];
int main(){
int n,p;
scanf("%d%d",&n,&p);
scanf("%s",s+1);
bool flag=false;
for(int i=n;i>=1;i--){
for(int j=(s[i]-'a')+1;j<p;j++){
char ch=j+'a';
if(i>2&&s[i-1]!=ch&&s[i-2]!=ch){
s[i]=ch;
flag=true;
break;
}
else if(i==2&&s[i-1]!=ch){
s[i]=ch;
flag=true;
break;
}
else if(i==1){
s[i]=ch;
flag=true;
break;
}
}
if(flag){
for(int j=i+1;j<=n;j++){
for(int k=0;k<p;k++){
char ch=k+'a';
if(j>2&&s[j-1]!=ch&&s[j-2]!=ch){
s[j]=ch;
break;
}
else if(j==2&&s[j-1]!=ch){
s[j]=ch;
break;
}
}
}
break;
}
}
if(flag) printf("%s\n",s+1);
else printf("NO\n");
return 0;
}