码迷,mamicode.com
首页 > 其他好文 > 详细

20171005校内训练

时间:2017-10-08 15:32:11      阅读:135      评论:0      收藏:0      [点我收藏+]

标签: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;
}
View Code

技术分享

20171005校内训练

标签:ima   替换   没有   回文   string   display   相等   open   ++   

原文地址:http://www.cnblogs.com/lher/p/7637409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!