A. No to Palindromes!
题意:一个长度为n的串,可以包含前p个小写字母。串中不包含长度为2及以上的回文串。求字典序比它大的下一个这样的串,如果没有输出NO。
思路:使串的字典序逐渐增加,并测试是否满足要求。刚开始我的解法是每次字典序+1,结果被hack了,这不是重点,重点是hack我的人是
tourist !
后来我意识到是TLE不是WA,就用了一种贪心方法,从头开始扫描,如果发现回文,立即让回文的地方增加。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#include <sstream>
#define INF 1000000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 100010
using namespace std;
char str[1010];
int num[1010];
int n,p;
bool judge(){
for(int i=1;i<n-1;i++){
if(num[i-1]==num[i+1])return false;
}
for(int i=0;i<n-1;i++){
if(num[i]==num[i+1])return false;
}
return 1;
}
bool add(){
num[n-1]++;
int t=n-1;
while(num[t]==p){
num[t]=0;
t--;
if(t<0)return 0;
num[t]++;
}
return 1;
}
bool add2(){
for(int i=0;i<n;i++){
if(i+1<n&&num[i]==num[i+1]){
num[i+1]++;
int t=i+1;
while(num[t]==p){
num[t]=0;
t--;
if(t<0)return 0;
num[t]++;
}
for(int j=t+1;j<n;j++){
num[j]=0;
}
}
if(i+2<n&&num[i]==num[i+2]){
num[i+2]++;
int t=i+2;
while(num[t]==p){
num[t]=0;
t--;
if(t<0)return 0;
num[t]++;
}
for(int j=t+1;j<n;j++){
num[j]=0;
}
}
}
return 1;
}
int main(){
while(cin>>n>>p){
cin>>str;
int len=strlen(str);
for(int i=0;i<len;i++){
num[i]=str[i]-'a';
}
while(true){
if(!add()){
cout<<"NO"<<endl;
break;
}
if(!add2()){
cout<<"NO"<<endl;
break;
}
if(judge()){
for(int i=0;i<n;i++){
str[i]=num[i]+'a';
}
cout<<str<<endl;
break;
}
}
}
return 0;
}