Good Bye 2020 C

Good Bye 2020 C

大意

给你一个仅由小写字母组成的串,你可以将任意位置换成任意小写字母。

问,你最少可以通过换几个字母使得串中没有长度大于一的回文串。

思路

首先,一个长度较大的回文串一定至少有一个长度较小的回文串在其中心。

对于奇数长度,这个较小的串长度为 (3) ,对于偶数长度,为 (2)

如果我们将这个较小的回文串破坏,显然以此为中心的更大的回文串(如果有)也会被破坏

因为小写字母有 (26) 个,而较小长度的回文串长度不超过 (3) ,所以,我们一定有一种替换方法,使得对于已经修改过的地方,不会生成新的回文串,对于现有的回文串,又能够破坏掉它。

然后贪心的将每个回文串的结束处的字母替换。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)

const int mod = 998244353;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int t;
string a;
int dp[100100][26];

int main() {
    cin >> t;
    while(t--) {
        int ans=0;
        cin >> a;
        int n = a.length();
        for(int i=0; i<n; i++) {
            if(i>0 && i<n-1)
                if(a[i-1] == a[i+1] && a[i-1] != '0') {
                    ++ans;
                    a[i+1] = '0';
                }
            if(i<n-1 && a[i] != '0')
                if(a[i] == a[i+1]) {
                    ++ans;
                    a[i+1] = '0';
                }
        }
        cout << ans << endl;
    }
    return 0;
}

28min,-0

原文地址:https://www.cnblogs.com/ullio/p/14215903.html