题意:给你一个字符串,包含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 }