传送门

题意简述:给出S,TS,TS,T两个字串,∣S∣≤10000,∣T∣≤1000|S|\le10000,|T|\le1000∣S∣≤10000,∣T∣≤1000,问至少从SSS中删去几个字符能够使得TTT不是修改后的SSS的字串。


思路:

考虑正难则反转化问题。

只需要求所有使得TTT不为SSS字串的SSS的字符数最大值。

于是设计状态fi,jf_{i,j}fi,j​表示SSS中前iii个字符匹配上TTT的第jjj位可保留的最多字符数。

然后考虑当前这一位删不删转移就行了。

可以用kmpkmpkmp来优化转移,时间复杂度O(nm)O(nm)O(nm)

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=10005,M=1005;
char s[N],t[M];
int tmp=0,ans=0,f[2][M],n,m,fail[M];
int main(){
    scanf("%s%s",s+1,t+1),n=strlen(s+1),m=strlen(t+1);
    for(ri i=1,j=0;i<=m;++i){
        while(j&&t[i+1]!=t[j+1])j=fail[j];
        fail[i+1]=t[i+1]==t[j+1]?++j:0;
    }
    memset(f[tmp],-1,sizeof(f[tmp]));
    f[tmp][0]=0;
    for(ri i=1;i<=n;++i){
        memset(f[tmp^1],-1,sizeof(f[tmp^1]));
        for(ri j=0,k;j<m;++j)if(~f[tmp][j]){
            f[tmp^1][j]=max(f[tmp^1][j],f[tmp][j]);
            k=j;
            while(k&&s[i]!=t[k+1])k=fail[k];
            if(s[i]==t[k+1])++k;
            f[tmp^1][k]=max(f[tmp^1][k],f[tmp][j]+1);
        }
        tmp^=1;
    }
    for(ri i=0;i<m;++i)ans=max(ans,f[tmp][i]);
    cout<<n-ans;
    return 0;
}

2019.03.01 bzoj3075: [Usaco2013]Necklace(kmp+dp)的更多相关文章

  1. 2019.03.25 bzoj4572: [Scoi2016]围棋(轮廓线dp)

    传送门 题解可以参见zjjzjjzjj神仙的,写的很清楚. 代码: #include<bits/stdc++.h> #define ri register int using namesp ...

  2. 2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP)

    2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP) https://www.luogu.com.cn/problem/P3426 题意: 你打算在纸上印一串字 ...

  3. [HDOJ5763]Another Meaning(KMP, DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种 ...

  4. 2019.03.28 bzoj3325: [Scoi2013]密码(manacher+模拟)

    传送门 题意: 现在有一个nnn个小写字母组成的字符串sss. 然后给你nnn个数aia_iai​,aia_iai​表示以sis_isi​为中心的最长回文串串长. 再给你n−1n-1n−1个数bib_ ...

  5. 2019.01.24 bzoj3125: CITY(轮廓线dp)

    传送门 题意简述:给一个n∗mn*mn∗m的网格图,有的格子不能走,有的格子只能竖着走,有的格子只能横着走,问用一条回路覆盖所有能走的格子的方案数. 思路: 就是简单的轮廓线dpdpdp加了一点限制而 ...

  6. 2019.01.24 bzoj2310: ParkII(轮廓线dp)

    传送门 题意简述:给一个m*n的矩阵,每个格子有权值V(i,j) (可能为负数),要求找一条路径,使得每个点最多经过一次且点权值之和最大. 思路:我们将求回路时的状态定义改进一下. 现在由于求的是路径 ...

  7. 2019.01.23 hdu3377 Plan(轮廓线dp)

    传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...

  8. 2019.01.23 hdu1964 Pipes(轮廓线dp)

    传送门 题意简述:给一个没有障碍的网格图,任意两个格子连通需要花费一定代价,现在求一条覆盖所有格子的哈密顿回路的总权值的最小值. 思路: 跟这道题一毛一样,除了把求和变成求最小值以外. 代码: #in ...

  9. hdu_3336: Count the string(KMP dp)

    题目链接 题意:求给定字符串中,可以与某一前缀相同的所有子串的数量 做这道题需要明白KMP算法里next[]数组的意义 首先用一数组nex[](这里与之前博客中提到的next明显不同)存储前缀后缀最长 ...

随机推荐

  1. Android Studio指定引用jnilibs 特定CPU架构的so库文件

    稍微大一些的项目都会用到第三方库,所以不可避免的会有针对不同手机cpu架构的.so库文件 'x86', 'x86_64', 'mips', 'mips64'  'armeabi' ,'armeabi- ...

  2. Error Code: 1786 Statement violates GTID consistency: CREATE TABLE ... SELECT.

    1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:call account_check_main('20180511') 错误 ...

  3. C#操作wps、excel

    比如打开表格,如下 object openEt() { ]; Type wpsAppName; string progID = "KET.Application";// " ...

  4. Java分割ID和姓名(String不能当输出参数)

    ID:包括数字和字母 姓名:汉字 package org.ah; import org.ah.utils.Utils; public class Test { public static void m ...

  5. python之json&pickle

    用于序列化的两个模块: json:用于字符串和python数类型间进行转换 oickle:用于python特有的类型和python的数据类型间进行转换 json.pickle模块提供四个功能:dump ...

  6. libevent安装后缺少libevent_openssl.so

    最近要使用阿里的rocketmq,需要依赖libevent,所以下了个源码自己编译安装,安装过程按照readme来的: 1 ./configure 2 make 3 make install 但是安装 ...

  7. CodeSmith 代码生成器

    在上一篇我们已经用PowerDesigner创建好了需要的测试数据库,下面就可以开始用它完成批量代码生成的工作啦. 下面我会一步步的解释如何用CodeSmith实现预期的结果的,事先声明一下,在此只做 ...

  8. pip install 提示代理连接失败原因及解决办法

    # pip install 提示代理连接失败原因及解决办法 1. 错误提示 在公司电脑上安装Python的虚拟环境时输入命令: pip install virtualenv 系统提示以下异常信息: R ...

  9. canvas绘制气泡

    思路:使用Math.random()函数绘制是个不同位置,大小,颜色的圆形,然后设置定时器,前一个状态用一个与画布相同颜色的背景图片进行覆盖,改变圆形的位置,每次改变都是在这张空白的背景图片上面重新进 ...

  10. Collection中的方法

    以ArrayList为例 package com.mydemo; import java.util.ArrayList; public class CollectionDemo { public st ...