【题目】http://codeforces.com/problemset/problem/814/C
【题意】给一个字符串,q次询问,给你m个字符c,问用这些字符能构成最长的连续字符cccccc...能到多长?
【思路】预处理字符串,对于a-z每个字符储存当给有0-n个cost字符时,能达到的最长连续字符长度。
对于a-z每种字符遍历s的每个子区间。
复杂度:O(26*n*n+q)
【代码】
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
char s[2000];
scanf("%s",s);
int ans[30][2000]= {0};
for(char c='a'; c<='z'; c++)
{
for(int i=0; i<n; i++)//i从0遍历到n-1
{
int cost=0;
for(int j=i; j<n; j++)//遍历i->i+1,i->i+2,i->i+3~i->n-1的区间
{
if(s[j]!=c)//如果不是当前的字符,那么花费++
cost++;
ans[c-'a'][cost]=max(ans[c-'a'][cost],j-i+1);
//每次更新花费对应的获得最大区间长度
}
}
}
for(int c=0; c<26; c++)
{
for(int i=1; i<=n; i++)
{
ans[c][i]=max(ans[c][i],ans[c][i-1]);
//将cost小的大值更新到cost大的地方
}
}
int q;
scanf("%d",&q);
for(int i=0; i<q; i++)
{
char x[5];
int qq;
scanf("%d %s",&qq,x);
printf("%d\n",ans[x[0]-'a'][qq]);
}
}