原题链接:http://codeforces.com/contest/814/problem/C
题意:有长度为n的一个字符串,q个询问,每个询问由数字m和字符c组成,问最多在字符串中替换m个字符,使连续的字符c的长度最大,输出这个最大值。
思路:首先可以想到,替换两段分开的子串变成连续的字符c肯定不能得到最大值,所以替换的部分必须是连续的一个子串。那么我们可以对于a~z每个字符枚举字符区间[l,r],区间内可被替换的字符数m对应能得到r-l+1的连续字符长度,一边枚举一边更新最大值。这里我们要求得恰好能被替换成a~z字符的最大次数,当输入的m超过这个最大次数,输出字符串长度n。
AC代码:
#include<iostream> #include<string> #include<cstdio> #include<cstring> using namespace std; int res[27][1505],num[27][1505]; int maxx[27]; int main() { char str[1505]; int n,q; char ch; scanf("%d", &n); scanf("%s", str); memset(res, 0, sizeof(res)); memset(num, 0, sizeof(num)); memset(maxx, 0, sizeof(maxx)); for(int i=0;i<26;i++){ for(int j=1;j<=n;j++){ if(str[j-1]-'a'==i) num[i][j]=num[i][j-1]+1; else num[i][j]=num[i][j-1]; num[i][j-1]=j-1-num[i][j-1]; } num[i][n]=n-num[i][n]; } int x; for(int k=0;k<26;k++){ for(int r=1;r<=n;r++){ for(int l=r;l>0;l--){ x=num[k][r]-num[k][l-1]; res[k][x]=max(res[k][x], r-l+1); maxx[k]=max(maxx[k], x); } } } scanf("%d", &q); int num; for(int i=0;i<q;i++){ scanf("%d %c", &num, &ch); if(maxx[ch-'a']<=num) printf("%d ", n); else printf("%d ", res[ch-'a'][num]); } return 0; }