#418(div2)C. An impassioned circulation of affection

题意:给你一个字符串,包含26个小写字母,然后q个询问,输入x,y,代表可以改动x个字符,问最长连续的y是多长

思路:我们可以预处理出某个字母在i-j中,全是它需要改动的个数,在比较改动x次最长的长度,就可以直接输出了。注意:如果改动i+1次,比改动i次要少,比如aaaaaa,改动2次,问连续a最长,还有用map存的话会超时,,

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[27][1501][1501];
 4 char s[1502];
 5 int ma[27][1502];
 6 
 7 int main(){
 8     int n;
 9     scanf("%d",&n);
10     scanf("%s",s+1);
11         for(int j=1;j<=n;j++){
12             for(int k=j;k<=n;k++){
13                 for(int i=0;i<26;i++){
14                     if(i==(s[k]-'a'))
15                         dp[i][j][k]=dp[i][j][k-1];
16                     else
17                         dp[i][j][k]=dp[i][j][k-1]+1;
18                     ma[i][dp[i][j][k]]=max(ma[i][dp[i][j][k]],k-j+1);
19                 }
20             }
21         }
22     int q;
23     for(int i=0;i<26;i++)
24         for(int j=1;j<=n;j++)
25         ma[i][j]=max(ma[i][j],ma[i][j-1]);
26     scanf("%d",&q);
27     char aa[2];
28     int x;
29     while(q--){
30         scanf("%d%s",&x,aa);
31        printf("%d
",ma[aa[0]-'a'][x]);
32     }
33 }
原文地址:https://www.cnblogs.com/hhxj/p/6961109.html