Codeforces Round #265 (Div. 1) A

来源:互联网 发布:淘宝买家钻石等级 编辑:程序博客网 时间:2024/05/29 19:10

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


0 0