• codeforces 814C(二分)


    题目链接:http://codeforces.com/contest/814/problem/C

    题意:给出一个字符串和一个字符,最多可以改k次,问全为该字符的子序列最长为多少。

    思路:sum[char][i]表示字符串前i项中有多少个字符不为该字符,枚举l,二分求r,复杂度O(26*n2*logn)

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    char a[1505];
    int sum[30][1505],ans[30][1505];
    int main()
    {
        int n,q,x;
        char c;
        scanf("%d",&n);
        scanf("%s",a+1);
        scanf("%d",&q);
        for(int i = 1; i <= 26; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(char(i + 96) != a[j])
                    sum[i][j] = sum[i][j-1] + 1;
                else
                    sum[i][j] = sum[i][j-1];
            }
        }
        for(int i = 1; i <= 26; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                for(int l = 1; l <= n; l++)
                {
                    int r = upper_bound(sum[i] + l, sum[i] + n + 1, sum[i][l-1] + j) - sum[i] - 1;
                    ans[i][j] = max(ans[i][j], r - l + 1);
                }
            }
        }
        while(q--)
        {
            scanf("%d %c",&x,&c);
            printf("%d
    ",ans[(int)(c - 96)][x]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    月食照片
    宾得镜头大全与发展史
    月食照片
    关于镜头系数的疑问
    经验和教训
    常用正则表达式
    12月19日
    部長面談
    周六
    异度空间
  • 原文地址:https://www.cnblogs.com/westwind1005/p/7019033.html
Copyright © 2020-2023  润新知