问题 H: 不要回文
"
时间限制 | 11 秒/Second(s) | 内存限制 | 512512 兆字节/Megabyte(s) |
提交总数 | 463463 | 正确数量 | 199199 |
裁判形式 | 标准裁判/Standard Judge | 我的状态 | 尚未尝试 |
难度 | 分类标签 | 贪心 |
题目描述
给出一个字符串S,你需要尽可能少的修改S中的字符,使得S不包含长度大 于等于2的回文子串。
输入
输人的第一行是一个字符串S, S只包含小写字母 S的长度大于5小于300
输出
输出使得S中不包含长度大于等于2的回文,最少要修改几个字符(可以修改
成任意字符)
样例输入复制
abbaa
样例输出复制
2
这一题我一开始没有思路,脑子比较整,后来看了题解才知道怎么做,相当于贪心从最小的情况分析,大得回文串必须是由小的回文串组成,所以我们只要把回文串最小的单位修改,就可以让字符串没有回文子串。使用num记录最小修改次数。
一共有三种情况:
(1)aa型但不是aaa型,所以只要修改第二个就可以(num + 1)
(2)aaa型,只要修改第二个和第三个就可以(num + 2)
(3)aba型只要修改最后一个(num + 1)
代码如下:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
typedef long long ll;
typedef pair<ll, ll>PII;
const int N = 1e6 + 50;
void work()
{
string s;
cin >> s;
ll num = 0;
for (int i = 0; i < s.size(); i++)
{
if (i + 2 < s.size() && s[i] == s[i + 1] && s[i + 1] == s[i + 2])
{
num += 2;
i += 2;
}
else if (i + 1 < s.size() && s[i] == s[i + 1])
{
num += 1;
i += 1;
}
else if (i + 2 < s.size() && s[i] == s[i + 2])
{
num += 1;
i += 2;
}
}
cout << num << '\n';
}
int main()
{
work();
return 0;
}