An impassioned circulation of affection
题意:
给定字符串,有q个操作,每次可以将m个字符变成c,问能将c字符变得最长的长度。
分析:
二分
#include<bits/stdc++.h>
using namespace std;
int pos[30][1505],temp[1505],n,ans[1505][30];
char s[1505];
int solve(int x,char c){
for(int i=1;i<=n;i++)
temp[i]=temp[i-1]+pos[c-'a'][i];
int mx=x;
for(int i=1;i<=n;i++){
int l=i,r=n,ans;
while(l<=r){
int m=(l+r)>>1;
int ll=m-i+1;
if(ll-(temp[m]-temp[i-1])<=x){
ans=m;
l=m+1;
}
else r=m-1;
}
mx=max(mx,ans-i+1);
}
return mx;
}
int main(){
scanf("%d",&n);
scanf("%s",s+1);
for(int i=1;i<=n;i++){
pos[s[i]-'a'][i]++;
}
int m;
scanf("%d",&m);
while(m--){
int x;
char c;
scanf("%d %c",&x,&c);
if(!ans[x][c-'a'])
ans[x][c-'a']=solve(x,c);
printf("%d\n",ans[x][c-'a']);
}
}
dp
#include<bits/stdc++.h>
using namespace std;
int sum[30][1505];
int dp[30][1505];
char s[1505];
int main(){
int n,q;
scanf("%d",&n);
scanf("%s",s+1);
for(int i=1;i<=n;i++){
for(int j=0;j<26;j++)
sum[j][i]=sum[j][i-1];
sum[s[i]-'a'][i]++;
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
for(int k=0;k<26;k++){
dp[k][j-i+1-(sum[k][j]-sum[k][i-1])]=max(dp[k][j-i+1-(sum[k][j]-sum[k][i-1])],j-i+1);
}
}
}
for(int i=1;i<=n;i++)
for(int j=0;j<26;j++)
dp[j][i]=max(dp[j][i],dp[j][i-1]+1);
scanf("%d",&q);
while(q--){
int x;
char c;
scanf("%d %c",&x,&c);
printf("%d\n",min(dp[c-'a'][x],n));
}
}