Educational 112 1555. D. Say No to Palindromes(前缀和)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational 112 1555. D. Say No to Palindromes(前缀和)相关的知识,希望对你有一定的参考价值。

LINK

题意

给定一个只包含 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

Educational Codeforces Round 63 D. Beautiful Array

Educational Codeforces Round 26 D. Round Subset 动态规划