Codeforces 464A No to Palindromes!(构造)

题目链接:Codeforces 464A No to Palindromes!

题目大意:给定n和m,以及一个字符串s,s不存在长度大于2的回文子串,现在要求输出一个字典比s大的字符串,并

且说同样不存在长度大于2的回文子串。

解题思路:直接去构造即可,从最后一位开始,每次只要考虑该字符是否和前两个字符相同即可。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1005;
int N, P;
char s[maxn];

bool check (int v) {
    if (v >= 1 && s[v] == s[v-1])
        return false;
    if (v >= 2 && s[v] == s[v-2])
        return false;
    return true;
}

bool solve (int v) {

    while(true) {
        if (v >= N)
            return true;

        if (v < 0)
            return false;

        if (s[v] - ‘a‘ == P - 1) {
            s[v] = ‘a‘ - 1;
            v--;
        } else {

            int k = (s[v] - ‘a‘ + 1) % P;
            s[v] = ‘a‘ + k;

            if (check(v))
                v++;
        }
    }
    return false;
}

int main () {
    scanf("%d%d%s", &N, &P, s);
    if (!solve(N-1))
        printf("NO\n");
    else
        printf("%s\n", s);
    return 0;
}
时间: 2024-10-11 00:11:59

Codeforces 464A No to Palindromes!(构造)的相关文章

Codeforces 429B Working out bfs构造

题目链接:点击打开链接 题意:给定n*m的矩阵 有一个人a从左上角走到右下角,只能↓或→走 另一个人b从左下角走到右上角,只能↑或→走 使得2个人的路径有且仅有一个格子是相交的. 统计2个人的权值和(相交格子的权值和不计) 问最大的权值和是多少. 思路: 首先转换一下题意,也就是找一个格子与4个角落连不相交的线. 我们观察相交的那个格子,那个格子的上下左右必然对应着一个角落. (i,j)点,那么(i-1,j)必然对应左上角或右上角的其中一个角落. 这样(i,j)点的4个相邻格子各自对应一个角落(

Codeforces 346C Number Transformation II 构造

题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<set> using namespace std; #define N 100010 #define L(x) (x<<1) #define R(x) (x<<

USACO Prime Palindromes 构造回文数

这道题目一点也不卡素数的判断 就是朴素的sqrt(n) 也不卡 所以~放心的用吧. 构造回文的时候看了HINT 其中是这么写的: Generate palindromes by combining digits properly. You might need more than one of the loops like below. /* generate five digit palindrome: */ for (d1 = 1; d1 <= 9; d1+=2) { /* only odd

codeforces 622. Optimal Number Permutation 构造

题目链接 假设始终可以找到一种状态使得值为0, 那么两个1之间需要隔n-2个数, 两个2之间需要隔n-3个数, 两个3之间隔n-4个数. 我们发现两个三可以放到两个1之间, 同理两个5放到两个3之间....这样就构造好了. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmat

codeforces #402C Searching for Graph 构造

题目大意:给定n和p,我们需要构造一张点数为n,边数为2n+p的简单无向图,满足任意一个点数为k的子图的边数不超过2k+p 逗B题-- 我们只需要把字典序最小的2n+p条边输出就行了 下面我们来证明这么做是对的 首先这个条件等价于[删掉任意k个点,都有至少2k条边被跟着删掉] 然后我们来看这样一个图: 显然这个图是我们构造的图的子图 下面我们来证明这个性质 假如我们删掉了k个点,那么: 如果删掉的k个点都是中间那一列的,由于一个点对应至少两条边,那么我们一定至少删掉了2k条边: 否则: 如果我们

codeforces #335div2 D. Lazy Student 构造

#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=1<<29; int n,m; struct Edge { int w,is; int id; friend bo

codeforces 710C Magic Odd Square(构造或者n阶幻方)

Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both main diagonals are odd. Input The only line contains odd integer n (1 ≤ n ≤ 49). Output Print n lines with n integers. All the integers should be differ

codeforces #550E Brackets in Implications 构造

题目大意:定义在集合{0,1}上的运算符"→",定义如下: 0→0=1 0→1=1 1→0=0 1→1=1 现在给定一个表达式a1→a2→a3→...→an,要求添加一些括号使得值为0 由于0=1→0,因此显然末尾必须是0,否则无解 然后我们这么构造: (a1→(a2→(a3→(...))))→an 由于an=0,所以前面的那些东西必须等于1 然后我们讨论an?1 如果an?1=1,那么前面那坨东西显然是1(因为0要求末尾是0) 如果an?1=0,那么找到前面第一个0,一直合成到这个0

codeforces #398C Tree and Array 构造

题目大意:给定一棵n个点的树和一个数组,数组初始为空,然后进行以下操作: 对于每条边(x,y)(x<y),如果这条边边权为z,就在数组中将[x,y]区间内的每个数+z 操作结束后统计数对(x,y)(x<y),满足在树上x和y之间的路径上的权值和等于数组上[x,y]的区间和 现在给定n,要求构造一棵n个点的树,满足这样的数对数≥?n2? 膜拜题解 n=5的情况我构造了半天--真是难搞啊 #include <cstdio> #include <cstring> #inclu