标签:ima 替换 没有 回文 string display 相等 open ++
给出一个美丽串,叫你找到下一个比它字典序大的回文串
我们考虑贪心的从后往前替换每一个字母。即对于最后一位(设字母为a),我们把它替换成从a到p的每个字母,如果都不满足美丽串的条件,那么把前一位字母从‘a‘替换到p。
问题来了,判断回文串需要O(n)的时间。
分析条件:没有回文串其实就是每个字符不与前两个字符相同。
因为题目给出的是一个美丽串,所以对于当前字符,如果存在大于3长度的回文串,那么这个回文串的字串也一定回文,与题意说的美丽串不符
如图,若替换1号后会形成1234这个回文串,那么2号和3号一定相等,但是原串是个美丽串,即2,3号必不相等,矛盾
然后贪心找出了最高位的数字后,从后往前贪心构造每一位。
即从字典序从小到大选择每一位上填的数,如果可以,则继续下一位
#include<iostream> #include<cstdio> using namespace std; int n,p;char c[100001]; bool check(int i) { if(i==0)return 0; if(i==1)return c[i]==c[i-1]; if(c[i]==c[i-1]||c[i]==c[i-2])return 1; return 0; } void up(int i) { for(;i<n;i++) { for(int j=1;j<=p;j++) { c[i]=‘a‘+j-1; if(!check(i))break; } } } int main() { //freopen("string.in","r",stdin);freopen("string.out","w",stdout); scanf("%d%d%s",&n,&p,c);bool fir=0; int i; for(i=n-1;i>=0;i--) { while(fir==0||(c[i]<=‘a‘+p-1&&check(i))){c[i]++;fir=1;} if(c[i]<=‘a‘+p-1){up(i+1);break;} else fir=0; } if(i==-1)return 0*puts("NO"); for(int i=0;i<n;i++)printf("%c",c[i]); return 0; }
标签:ima 替换 没有 回文 string display 相等 open ++
原文地址:http://www.cnblogs.com/lher/p/7637409.html