Codeforces 465C No to Palindromes!【暴力+思维】

A. No to Palindromes!
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Paul hates palindromes. He assumes that strings is tolerable if each its character is one of the firstp letters of the English alphabet and s doesn't contain any palindrome contiguous substring of length 2 or more.

Paul has found a tolerable string s of lengthn. Help him find the lexicographically next tolerable string of the same length or else state that such string does not exist.

Input

The first line contains two space-separated integers: n andp (1 ≤ n ≤ 1000;1 ≤ p ≤ 26). The second line contains strings, consisting of n small English letters. It is guaranteed that the string is tolerable (according to the above definition).

Output

If the lexicographically next tolerable string of the same length exists, print it. Otherwise, print "NO" (without the quotes).

Examples
Input
3 3
cba
Output
NO
Input
3 4
cba
Output
cbd
Input
4 4
abcd
Output
abda
Note

String s is lexicographically larger (or simply larger) than stringt with the same length, if there is numberi, such that s1 = t1, ...,si = ti,si + 1 > ti + 1.

The lexicographically next tolerable string is the lexicographically minimum tolerable string which is larger than the given one.

A palindrome is a string that reads the same forward or reversed.


题目大意:

给你一个长度为N的串,其中只包含前p个英文字母,保证输入的是一个子序列中没有长度为2或者是长度大于2的回文串。

让你找到一个比原字符串字典序大的第一个也满足:子序列中没有长度为2或者是长度大于2的回文串的解。如果不存在,输出NO。


思路:


1、好菜啊T T又看题解辣T T,思路来源:http://blog.csdn.net/keshuai19940722/article/details/39137373


2、如果一个字符串没有长度为2的子回文串,那么就能保证整个字符串是没有两个相邻的字符相同的。

同理,如果一个字符串没有长度为3的子回文串,那么就能保证整个字符串没有两个间隔一个字符的两个字符是相同的。

那么换句话说,综上两点,就是在说没有任意三个相邻的字符是相同的,只要满足这一点,那么这个字符串一定是一个可行串。


3、那么我们从最后边开始暴力处理:

①如果当前位子<0,那么说明不存在可行解,如果当前位子==n,那么说明存在解。

②对应当前位子的字符字典序+1,判断一下当前位子和前边两个位子的字符是否相等,如果存在相等,说明当前解不可行,继续字典序+1.

如果不存在相等,那么当前位子是一个可行解,将位子向后移一位。

③若在过程②中,当前位子的字符字典序加到了p还是不可行,那么我们将位子向前移一位,去处理之前为可行之后,再回到这个位子重新暴力处理。


Ac代码:

#include<stdio.h>
#include<string.h>
using namespace std;
char a[10005];
int judge(int pos)
{
    if(pos>=1&&a[pos-1]==a[pos])return 0;
    if(pos>=2&&a[pos-2]==a[pos])return 0;
    return 1;
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        scanf("%s",a);
        int pos=n-1;
        while(1)
        {
            if(pos==n)
            {
                printf("%s\n",a);break;
            }
            if(pos<0)
            {
                printf("NO\n");break;
            }
            if(a[pos]-'a'+1==m)
            {
                a[pos]='a'-1;
                pos--;
            }
            else
            {
                int tmp=(a[pos]-'a'+1)%m;
                a[pos]='a'+tmp;
                if(judge(pos)==1)pos++;
            }
        }
    }
}





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值