cf 814C 思维
http://codeforces.com/contest/814/problem/C
给定一个字符串s,长度小于1500,进行q次询问q<=20w,每次询问输入一个m和一个字符c,求将最多m个c代替原来字符串的某些位置,能得到的连续个c的最长长度。
很容易想到一个n*n*q的暴力做法,但是会超时,由于只有26个字母,最长1500,考虑预处理所有结果。
枚举所有的字母,然后枚举所有的区间,预处理找出m个c对应的最佳区间长度。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define inf 0x3f3f3f3f 4 int dp[26][1510]={0}; 5 int main() 6 { 7 8 int n,m,i,j,k,q; 9 char s[1550],ch; 10 cin>>n>>(s+1)>>q; 11 for(int alp=0;alp<26;++alp) 12 { 13 for(i=1;i<=n;++i) 14 { 15 int tot=0; 16 for(j=i;j<=n;++j) 17 { 18 if(s[j]-'a'!=alp) ++tot; 19 dp[alp][tot]=max(dp[alp][tot],j-i+1); 20 } 21 22 } 23 for(i=1;i<=n;++i) dp[alp][i]=max(dp[alp][i],dp[alp][i-1]); 24 } 25 while(q--){ 26 scanf("%d %c",&m,&ch); 27 printf("%d\n",dp[ch-'a'][m]); 28 } 29 return 0; 30 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步