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;
    }
  • 相关阅读:
    [codevs 1227] 方格取数 2
    记冬令营
    Codeforces Round 558(Div 2)题解
    Educational Round 64 题解
    [GXOI/GZOI2019]与或和(位运算,单调栈)
    LOJ6053 简单的函数(min_25筛)
    LOJ6235 区间素数个数(min_25筛)
    min_25筛学习笔记
    CF1142C U2(计算几何,凸包)
    关于一些没做出来的SBCF题
  • 原文地址:https://www.cnblogs.com/czy-power/p/10545081.html
Copyright © 2011-2022 走看看