/*
题意:给你一个字符串,寻找按照字典序排的下一个符合条件的字符串
下一个满足的字符串一定是改变尽量靠右的字符才能得到(字典序),
从最右面开始找,假设当前是第i位,如果i位增加之后满足和i-1,i-2位均不相同的话,
那么最小的肯定就是从这里开始改的(因为前缀没有回文字串,所以改变i位后的串也不会有),
接下来就把后面的为都补全。
*/
# include<stdio.h>
# include<algorithm>
# include<string.h>
# include<iostream>
using namespace std;
char a[1234567];
int n,p;
bool judge(int now)
{
for(int i=1;; i++)
{
if(a[now]+i>'a'+p-1)
return false;
if(now>0&&a[now]+i==a[now-1])
continue;
if(now>1&&a[now]+i==a[now-2])
continue;
a[now]+=i;
return true;
}
}
void get(int now)
{
for(int i=0;; i++)
{
if(now>0&&'a'+i==a[now-1])
continue;
if(now>1&&'a'+i==a[now-2])
continue;
a[now]='a'+i;
return ;
}
}
int main()
{
scanf("%d%d",&n,&p);
scanf("%s",a);
int ok=0;
int i;
for( i=n-1; i>=0; i--)
{
if(judge(i))
{
ok=1;
break;
}
}
if(ok)
{
for( i=i+1; i<n; i++) //
get(i);
printf("%s\n",a);
}
else
printf("NO\n");
return 0;
}
No to Palindromes
最新推荐文章于 2022-01-15 11:54:29 发布