列表

详情


NC15362. 删除子串

描述

给你一个长度为n且由a和b组成的字符串,你可以删除其中任意的部分(可以不删),使得删除后的子串“变化”次数小于等于m次且最长。
变化:如果a[i]!=a[i+1]则为一次变化。(且新的字符串的首字母必须是'a')
如果初始串全为b,则输出0。

输入描述

第一行输入两个数n,m。(1 <= n <= 105,0 <= m <= 10)
第二行输入一行长度为n且由a和b组成的字符串

输出描述

输出一个数字表示最长长度

示例1

输入:

8 2
aabbabab

输出:

6

说明:

原串可以变成aabbbb,只改变了一次,且长度最长。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 480K, 提交时间: 2018-10-23 22:39:00

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
int a[13],b[13];
char s[1000005];
int main() {
	int n,m;
	scanf("%d %d %s",&n,&m,s + 1);
	int k = 1;
	while(k <= n && s[k] == 'b') k++;
	rep(i,k,n) {
		a[0] += (s[i] == 'a');
		rep(j,1,m) {
			if(s[i] == 'a') {
				a[j] = max(a[j],b[j-1]) + 1;
			} else {
				b[j] = max(b[j],a[j-1]) + 1;
			}
		}
	}
	int ans = 0;
	rep(i,1,m) {
		ans = max(ans,max(a[i],b[i]));
	}
	cout << ans;
}

C++ 解法, 执行用时: 7ms, 内存消耗: 556K, 提交时间: 2021-11-10 20:25:49

#include<bits/stdc++.h>
using namespace std;
string s;
int a[15],b[15],n,m,cnt,ans;
int main()
{
	cin>>n>>m>>s;
	while(s[cnt]=='b') cnt++;
	for(;cnt<n;cnt++)
	{
		if(s[cnt]=='a') a[0]++;
		for(int i=1;i<=m;i++)
        {
            if(s[cnt]=='a') a[i]=max(a[i],b[i-1])+1;
			else b[i]=max(b[i],a[i-1])+1;
        }
	}
	for(int i=0;i<=m;i++) ans=max(ans,max(a[i],b[i]));
	cout<<ans;
	return 0;
}

上一题