转博客大法好

第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康).

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. template<class T>inline void read(T &num) {
  5. register char ch; register int flg = 1;
  6. while(!isdigit(ch=getchar()))if(ch=='-')flg=-flg;
  7. for(num=0; isdigit(ch); num=num*10+ch-'0', ch=getchar());
  8. num *= flg;
  9. }
  10. const int MAXN = 2005;
  11. const int C = 26;
  12. char A[MAXN], B[MAXN];
  13. int f[MAXN][MAXN];
  14. namespace task1 {
  15. inline void solve() {
  16. int ans = MAXN-1;
  17. for(int i = 1; A[i]; ++i) {//字串的右端点
  18. int mx = 0;
  19. for(int j = 1; B[j]; ++j)
  20. if(A[i] == B[j])
  21. mx = max(mx, f[i][j] = f[i-1][j-1] + 1);
  22. if(mx < i) ans = min(ans, mx+1);
  23. }
  24. printf("%d\n", (A[ans] && B[ans]) ? ans : -1);
  25. }
  26. }
  27. namespace task2 {
  28. inline void solve() {
  29. int ans = MAXN-1;
  30. for(int i = 1; A[i]; ++i) {//字串的右端点
  31. int mx = 0;
  32. for(int j = 1; B[j]; ++j) {
  33. if(A[i] == B[j])
  34. mx = max(mx, f[i][j] = f[i-1][j-1] + 1);
  35. else mx = max(mx, f[i][j] = f[i][j-1]);
  36. }
  37. if(mx < i) ans = min(ans, mx+1);
  38. }
  39. printf("%d\n", (A[ans] && B[ans]) ? ans : -1);
  40. }
  41. }
  42. namespace task3 {
  43. int sz, last, len[MAXN<<1], link[MAXN<<1], ch[MAXN<<1][C], dp[MAXN<<1];
  44. inline void init() {
  45. memset(dp, 0x3f, sizeof dp);
  46. sz = last = 0; ++sz;
  47. len[0] = dp[0] = 0;
  48. link[0] = -1;
  49. //memset(ch, 0, sizeof ch);
  50. }
  51. inline void insert(int c) {
  52. int cur = sz++, p;
  53. len[cur] = len[last] + 1;
  54. for(p = last; ~p && !ch[p][c]; p = link[p]) ch[p][c] = cur;
  55. if(p == -1) link[cur] = 0;
  56. else {
  57. int q = ch[p][c];
  58. if(len[p] + 1 == len[q]) link[cur] = q;
  59. else {
  60. int clone = sz++;
  61. len[clone] = len[p] + 1;
  62. link[clone] = link[q];
  63. memcpy(ch[clone], ch[q], sizeof ch[q]);
  64. for(; ~p && ch[p][c] == q; p = link[p]) ch[p][c] = clone;
  65. link[cur] = link[q] = clone;
  66. }
  67. }
  68. last = cur;
  69. }
  70. inline void solve() {
  71. init();
  72. for(int i = 1; B[i]; ++i) insert(B[i]-'a');
  73. int ans = MAXN-1;
  74. for(int i = 1, c; A[i]; ++i) {
  75. c = A[i]-'a';
  76. for(int j = 0; j < sz; ++j) {
  77. if(ch[j][c]) dp[ch[j][c]] = min(dp[ch[j][c]], dp[j] + 1);
  78. else ans = min(ans, dp[j] + 1);
  79. }
  80. }
  81. printf("%d\n", (A[ans] && B[ans]) ? ans : -1);
  82. }
  83. }
  84. namespace task4 {
  85. int nxt[MAXN][C], pos[C], dp[MAXN];
  86. inline void solve() {
  87. int len = strlen(B+1);
  88. memset(dp, 0x3f, sizeof dp);
  89. dp[0] = 0;
  90. for(int i = len; ~i; --i) { //要循环到0
  91. for(int c = 0; c < 26; ++c)
  92. nxt[i][c] = pos[c];
  93. if(i) pos[B[i]-'a'] = i;
  94. }
  95. int ans = MAXN-1;
  96. for(int i = 1, c; A[i]; ++i) {
  97. c = A[i]-'a';
  98. for(int j = len; ~j; --j) //要循环到0
  99. if(nxt[j][c]) dp[nxt[j][c]] = min(dp[nxt[j][c]], dp[j] + 1);
  100. else ans = min(ans, dp[j] + 1);
  101. }
  102. printf("%d\n", (A[ans] && B[ans]) ? ans : -1);
  103. }
  104. }
  105. int main() {
  106. scanf("%s%s", A+1, B+1);
  107. task1::solve();
  108. task2::solve();
  109. task3::solve();
  110. task4::solve();
  111. }

BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)的更多相关文章

  1. BZOJ.4032.[HEOI2015]最短不公共子串(DP 后缀自动机)

    题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. ...

  2. BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力

    4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...

  3. BZOJ 4032: [HEOI2015]最短不公共子串

    4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 446  Solved: 224[Submit][Sta ...

  4. bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子 ...

  5. bzoj 4032: [HEOI2015]最短不公共子串【dp+SAM】

    第一.二问: 就是最小的最长公共长度+1,设f[i][j]为a匹配到i,b匹配到j,第一问的转移是f[i][j]=(a[i]==b[j]?f[i-1][j-1]+1:0),第二问的转移是f[i][j] ...

  6. BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)

    传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...

  7. BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)

    这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...

  8. 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)

    [题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...

  9. bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)

    4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...

随机推荐

  1. Docker CE 下载方式

    1. 找到一个网址挺好的 https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/arm64/ mark 一下 以后用.

  2. (5.13)mysql高可用系列——1主3从复制(SSL)

    目录: [0]需求 目前使用Mysql数据库,100GB+数据量,需要实现1主3从环境. 需要实现SSL安全复制,同时需要测试异常宕机切换演练 [1]实验环境 数据库架构:主从复制,基于主库搭建3个从 ...

  3. spring-boot 使用servlet2.5(四)

    环境 jdk 6 tomcat 6.0.53 sts 4.4.2 maven 3.2.5 背景 由于环境限制,还在使用 servlet 2.5,所以需要将 spring boot 进行配置,支持 se ...

  4. T100——读取系统程序临时表数据

    SELECT   * FROM   USER_OBJECTS ORDER  BY  CREATED DESC SELECT   * FROM   USER_OBJECTS WHERE  OBJECT_ ...

  5. Django+celery+rabbitmq实现邮件发送

    一.环境 1.pip包 amqp==2.4.2 anyjson==0.3.3 billiard==3.6.0.0 celery==4.3.0 Django==2.2 dnspython==1.16.0 ...

  6. 页面加载时调用js函数方法

    方法一:在html的body中加入onload=""事件 <body onload='queryServer()'> </body> 方法二:jquery ...

  7. 微信小程序点击复制功能

    wx.setClipboardData({ data: '这是要复制的文字', success: function (res) { wx.showModal({ title: '提示', conten ...

  8. 关于SQL查询某年数据 和DATEPART 函数的使用

    数据库查询某年数据(sql server)select *from 表名 where YEAR(存时间的字段名) =某年select *from News where YEAR(addDate) =2 ...

  9. WebApi 跨域解决方案 --CORS

    跨站HTTP请求(Cross-site HTTP request)是指发起请求的资源所在域不同于请求指向的资源所在域的HTTP请求. 比如说,我在Web网站A(www.a.com)中通过<img ...

  10. Photoshop从入门到精通所有视频教程(43G)以及素材资料免费拿

    包含了Photoshop从入门到精通所有需要了解的视频教程资料,并且包含了大量的P图素材. 资料获取方式,关注公总号RaoRao1994,查看往期精彩-所有文章,即可获取资源下载链接 更多资源获取,请 ...