codeforces 465 C. No to Palindromes!(暴力+思维)

题目链接:http://codeforces.com/contest/465/problem/C

题意:给出一个不存在2个或以上回文子串的字符串,全是由小写字母组成而且字母下表小于p,问刚好比这个字符串

大的字符串是什么,如果没有输出NO

题解:就是遍历一遍当前字母要么不变要么增大,如果增大自行构成后续最小。如果等于继续遍历。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char s[1010];
int a[1010] , c[1010][1010];
int n , p;
int main() {
    scanf("%d%d" , &n , &p);
    scanf("%s" , s + 1);
    for(int i = 1 ; i <= n ; i++) {
        a[i] = s[i] - 'a';
    }
    a[0] = -1;
    memset(c , -1 , sizeof(c));
    for(int i = 1 ; i <= n ; i++) {
        for(int j = 1 ; j < i ; j++) {
            c[i][j] = a[j];
        }
        for(int j = a[i] + 1 ; j < p ; j++) {
            if(i == 1) {
                c[i][i] = j;
                break;
            }
            else {
                if(j != a[i - 1] && j != a[i - 2]) {
                    c[i][i] = j;
                    break;
                }
            }
        }
        for(int j = i + 1 ; j <= n ; j++) {
            for(int k = 0 ; k < p ; k++) {
                if(k != c[i][j - 1] && k != c[i][j - 2]) {
                    c[i][j] = k;
                    break;
                }
            }
        }
    }
    int flag = 1 , temp = 0;
    for(int i = n ; i >= 1 ; i--) {
        flag = 0;
        temp = i;
        for(int j = 1 ; j <= n ; j++) {
            if(c[i][j] == -1) {
                flag = 1;
                break;
            }
        }
        if(!flag) break;
    }
    if(!flag) {
        for(int i = 1 ; i <= n ; i++) {
            char cp = c[temp][i] + 'a';
            printf("%c" , cp);
        }
        printf("
");
    }
    else {
        printf("NO
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6727401.html