Educational 112 1555. D. Say No to Palindromes(前缀和)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational 112 1555. D. Say No to Palindromes(前缀和)相关的知识,希望对你有一定的参考价值。
题意
给定一个只包含 a , b , c a,b,c a,b,c三种字母的字符串
你需要修改最少的字母(修改为a,b,c),使得修改后的字符串不存在长度至少为 2 2 2的回文串
求最小的修改次数
不能有长度为 2 2 2的回文,也就是不能有连续字母出现
不能有长度为 3 3 3的回文,设前两个字母是ab,那么第三个字母只能是c
于是可以发现,字符串一定是abc,acb,bac,bca,cab,cba循环中的一种
对这 6 6 6种可能分别求一遍代价的前缀和即可,实现起来略有技巧
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
char s[maxn];
int n,m;
int main()
{
cin >> n >> m >> ( s+1 );
vector<vector<int> >vec;
for(char a:{'a','b','c'} )
for(char b:{'a','b','c'} )
for(char c:{'a','b','c'} )
{
if( a==b || a==c || b==c ) continue;
vector<int>temp(n+2,0);
vec.push_back( temp );
for(int i=1;i<=n;i++)
{
char w = i%3==0?a:( i%3==1?b:c );
vec.back()[i] = vec.back()[i-1]+( w!=s[i] );
}
}
while( m-- )
{
int l,r,ans = 1e9; cin >> l >> r;
for(auto &v:vec ) ans = min( ans,v[r]-v[l-1] );
cout << ans << endl;
}
}
以上是关于Educational 112 1555. D. Say No to Palindromes(前缀和)的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces112 1555.E. Boring Segments(尺取+线段树)
Codeforces1555 D. Say No to Palindromes(思维,前缀和)
Educational Codeforces Round 112 (Rated for Div. 2)
Educational Codeforces Round 20 D. Magazine Ad