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