Codeforces 1303E - Erase Subsequences

Posted urushibara-ruka

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1303E - Erase Subsequences相关的知识,希望对你有一定的参考价值。

Description

从字符串$s$中选出子集从左往右按顺序放到$p$的结尾($p$初始为空串),最多可以这样操作两次,询问是否能得到 $p=t (1leq|t|leq|s|leq400)$


 Solution

在$t$中枚举断点$mid$,$t[1, mid]$为第一次操作选出,$t[mid + 1, |t|]$为第二次操作选出
$f[i][j]$表示当前是否能达到第一次操作串匹配$i$位,第二次操作串中匹配$j$位
$f[i][j] |= egin{cases} f[i - 1][j] (s[k] == t[i]) \ f[i][j - 1] (s[k]==t[j + mid])end{cases}$
这样复杂度$O(n^4)$
显然有这样一个结论
若$f[a][b] == true$, $forall x in [1,a],y in [1,b]$, 有$f[x][y]==true$
因此$i,j$均不为当前最长匹配的转移是多余的
$Max1[i]$表示第一次操作串中匹配$i$位时,第二次操作串中最多匹配几位
$Max2[i]$表示第二次操作串中匹配$i$位时,第一次操作串中最多匹配几位
每次只需拓展这两个数组就行
两数组相反,每次拓展完要通过自己修改对方
注意$s$中每个字符只能用一次,要倒序枚举,互相修改要等两数组自身都修改完
复杂度$O(n^3)$


Code

技术图片
#include <bits/stdc++.h>
using namespace std;


int T, len1, len2, Max1[410], Max2[410];

char s[410], t[410];

int main() {
    scanf("%d", &T);
    while (T--) {
        scanf("%s
%s", s + 1, t + 1);
        len1 = strlen(s + 1), len2 = strlen(t + 1);
        bool flag = false;
        for (int Mid = 1; Mid <= len2; Mid++) {
            for (int i = 1; i <= Mid; i++) Max1[i] = -1;
            for (int j = 1; j + Mid <= len2; j++) Max2[j] = -1;
            Max1[0] = Max2[0] = 0;
            for (int k = 1; k <= len1; k++) {
                for (int i = Mid; i; i--) if (s[k] == t[i]) Max1[i] = max(Max1[i], Max1[i - 1]);
                for (int j = len2 - Mid; j; j--) if (s[k] == t[j + Mid]) Max2[j] = max(Max2[j], Max2[j - 1]);
                for (int i = 0; i <= Mid && Max1[i] != -1; i++) Max2[Max1[i]] = max(Max2[Max1[i]], i);
                for (int j = 0; j + Mid <= len2 && Max2[j] != -1; j++) Max1[Max2[j]] = max(Max1[Max2[j]], j);
            }
            if (Max1[Mid] == len2 - Mid) {
                flag = true;
                break;
            }
        }
        puts(flag ? "YES" : "NO");
    }
    return 0;
} 
View Code

 

以上是关于Codeforces 1303E - Erase Subsequences的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces1537 E2. Erase and Extend (Hard Version)(lcp)

鏆村姏dp+鐘舵€佽璁℃€濈淮鈥斺€攃f1303E

CodeForces - 1537E2 Erase and Extend (Hard Version)(扩展KMP-比较两个前缀无限循环后的字典序大小)

[CodeForces7B]Memory Manager

Codeforces Round #456 (Div. 2)

Codeforces 1037E Trips图论dfs