Codeforces Round #265 (Div. 1) A

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;
}


你可能感兴趣的:(贪心,回文串)