#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
int n,m;
char ch[100005];
int dp[100005][2];
int ct[100005][5][2];
int main() {
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
memset(ct,0,sizeof(ct));
scanf("%s",ch);
scanf("%d",&m);
for(int i=1;i<=n;i++)
{
int id=i%2;
char tp=ch[i-1];
for(int j=0;j<3;j++)
{
for(int k=0;k<2;k++)
{
ct[i][j][k]=ct[i-1][j][k];
}
}
if(tp=='a')
ct[i][0][id]++;
else if(tp=='b')
ct[i][1][id]++;
else if(tp=='?')
ct[i][2][id]++;
}
dp[0][0]=dp[0][1]=0;
for(int i=m;i<=n;i++)
{
dp[i][0]=dp[i-1][0];
dp[i][1]=dp[i-1][1];
int val=0,cost=0;
int sta=i-m+1;
int ae=ct[i][0][0]-ct[i-m][0][0];
int ao=ct[i][0][1]-ct[i-m][0][1];
int be=ct[i][1][0]-ct[i-m][1][0];
int bo=ct[i][1][1]-ct[i-m][1][1];
if(sta%2==1)
{
if(ae==0 && bo==0)
{
val=dp[i-m][0]+1;
cost=dp[i-m][1]+(m-ao-be);
if((val>dp[i][0]) || (val==dp[i][0] && cost < dp[i][1]))
{
dp[i][0]=val;dp[i][1]=cost;
}
}
}
else
{
if(ao==0 && be==0)
{
val=dp[i-m][0]+1;
cost=dp[i-m][1]+(m-ae-bo);
if((val>dp[i][0]) || (val==dp[i][0] && cost < dp[i][1]))
{
dp[i][0]=val;dp[i][1]=cost;
}
}
}
}
printf("%d\n",dp[n][1]);
}
return 0;
}
E. Maximum Questions dp
猜你喜欢
转载自blog.csdn.net/c_czl/article/details/88135062
今日推荐
周排行