zoukankan      html  css  js  c++  java
  • 至多删三个字符

    L3-020 至多删三个字符 (30 分)

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?

    输入格式:

    输入在一行中给出全部由小写英文字母组成的、长度在区间 [4, 106​​] 内的字符串。

    输出格式:

    在一行中输出至多删掉其中 3 个字符后不同字符串的个数。

    输入样例:

    ababcc
    

    输出样例:

    25
    

    提示:

    删掉 0 个字符得到 "ababcc"。

    删掉 1 个字符得到 "babcc", "aabcc", "abbcc", "abacc" 和 "ababc"。

    删掉 2 个字符得到 "abcc", "bbcc", "bacc", "babc", "aacc", "aabc", "abbc", "abac" 和 "abab"。

    删掉 3 个字符得到 "abc", "bcc", "acc", "bbc", "bac", "bab", "aac", "aab", "abb" 和 "aba"。

    Solution:注意去重是到最近的。

    #include <bits/stdc++.h>
    
    using namespace std;
    const int maxn=1e6+10;
    char str[maxn];
    long long dp[maxn][6];
    int main()
    {
        scanf("%s",str+1);
        dp[0][0]=1;
        int n=strlen(str+1);
        for(int i=1;i<=n;i++){
            for(int j=0;j<=3;j++){
                if(!dp[i-1][j])continue;
                if(j<3)dp[i][j+1]+=dp[i-1][j];
                dp[i][j]+=dp[i-1][j];
                for(int k=i-1;k>=1&&(i-k)<=j;k--){
                     if(str[i]==str[k]){
                        dp[i][j]-=dp[k-1][j-(i-k)];
                        break;
                     }
                }
            }
        }
        cout<<dp[n][0]+dp[n][1]+dp[n][2]+dp[n][3]<<endl;
        return 0;
    }
  • 相关阅读:
    [BZOJ1565][NOI2009]植物大战僵尸
    [BZOJ1566][NOI2009]管道取珠
    [BZOJ4104][Thu Summer Camp 2015]解密运算
    [BZOJ1003][ZJOI2006]物流运输
    [BZOJ3790]神奇项链
    指纹模块原理_光学指纹模块原理
    Ubuntu 16.04无损分区大小调整工具Gparted
    16进制转换10进制
    Memory Ordering in Modern Microprocessors
    python 多态
  • 原文地址:https://www.cnblogs.com/czy-power/p/10545081.html
Copyright © 2011-2022 走看看