思路 :

先对b 的所有后缀建立trie树

第一问

暴力枚举a串的起点

在trie树上跑 找到最短的

第二问

也是暴力枚举a串的起点

a和b顺着暴力匹配就好

第三问

求出来a在第i个位置 加一个字母j 能够到的最近的位置 f[i][j] 到最后就是inf

从f[0][j]DFS 在trie上跟着跑找到最小的deep更新答案

第四问

先按照求f一样同理求出b串 的  g

dp[i][j]表示a的前i个位置 b不得不匹配到b的第j个位置

            dp[i+1][j]=min(dp[i+1][j],dp[i][j]),
            dp[i+1][g[j][a[i]]]=min(dp[i+1][g[j][a[i]]],dp[i][j]+1);
1—>strlen(a)+1 min dp[i][inf]就是答案
 
这题看起来简单  其实感觉在考场根本写不出来...
 
  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int N=,inf=;
  7. int ch[N*N/][],f[N][],g[N][],dp[N][N],cnt,ans1,ans2,ans3,ans4,vis[];
  8. void insert(char *a){
  9. int now=;
  10. for(int i=;a[i];i++){
  11. if(!ch[now][a[i]])ch[now][a[i]]=++cnt;
  12. now=ch[now][a[i]];
  13. }
  14. }
  15. int solve1(char *a){
  16. int now=,i;
  17. for(i=;a[i];i++){
  18. if(!ch[now][a[i]])return i+;
  19. else now=ch[now][a[i]];
  20. }return inf;
  21. }
  22. void solve3(int x,int now,int deep){
  23. if(x==inf)return;
  24. if(!now&&deep){ans3=min(ans3,deep);return;}
  25. for(int i=;i<=;i++)solve3(f[x][i],ch[now][i],deep+);
  26. }
  27. char a[N],b[N];
  28. int main(){
  29. scanf("%s%s",a+,b+);
  30. int n1=strlen(a+),n2=strlen(b+);
  31. for(int i=;i<=n1;i++)a[i]=a[i]-'a'+;
  32. for(int i=;i<=n2;i++)b[i]=b[i]-'a'+;
  33. for(int i=;i<=n2;i++)insert(b+i);
  34. ans1=ans2=ans3=ans4=inf;
  35. for(int i=;i<=n1;i++)ans1=min(ans1,solve1(a+i));
  36. for(int i=;i<=n1;i++){
  37. int now=;
  38. for(int j=;i+j<=n1;now++,j++){
  39. while(a[i+j]!=b[now]&&now<=n2)now++;
  40. if(now>n2){ans2=min(ans2,j+);break;}
  41. }
  42. }
  43. for(int i=;i<=n1;i++){
  44. memset(vis,,sizeof(vis));
  45. for(int j=i+;j<=n1;j++)if(!vis[a[j]])vis[a[j]]=j;
  46. for(int j=;j<=;j++)f[i][j]=vis[j]?vis[j]:inf;
  47. }solve3(,,);
  48. for(int i=;i<=n2;i++){
  49. memset(vis,,sizeof(vis));
  50. for(int j=i+;j<=n2;j++)if(!vis[b[j]])vis[b[j]]=j;
  51. for(int j=;j<=;j++)g[i][j]=vis[j]?vis[j]:inf;
  52. }
  53. memset(dp,0x3f,sizeof(dp)),dp[][]=;
  54. for(int i=;i<=n1;i++)
  55. for(int j=;j<=n2;j++)
  56. dp[i+][j]=min(dp[i+][j],dp[i][j]),
  57. dp[i+][g[j][a[i]]]=min(dp[i+][g[j][a[i]]],dp[i][j]+);
  58. for(int i=;i<=n1+;i++)ans4=min(ans4,dp[i][inf]);
  59. printf("%d\n%d\n%d\n%d\n",ans1==inf?-:ans1,ans2==inf?-:ans2,ans3==inf?-:ans3,ans4==inf?-:ans4);
  60. }

BZOJ 4032 trie树+各种乱搞的更多相关文章

  1. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  2. [NOIP2018]:旅行(数据加强版)(基环树+搜索+乱搞)

    题目描述 小$Y$是一个爱好旅行的$OIer$.她来到$X$国,打算将各个城市都玩一遍.小$Y$了解到,$X$国的$n$个城市之间有$m$条双向道路.每条双向道路连接两个城市.不存在两条连接同一对城市 ...

  3. BZOJ 4260 trie树

    思路: 搞一个前缀异或和 一次从左往右 另一次从右往左 异或最大值 用字典树搞一搞 //By SiriusRen #include <cstdio> #include <cstrin ...

  4. BZOJ 2251 Trie树

    思路: i~n加到Trie树里 经过的边权+1 DFS一遍 搞定~ //By SiriusRen #include <cstdio> #include <cstring> #i ...

  5. [luoguP2325] [SCOI2005]王室联邦(树分块乱搞)

    传送门 想了半小时,没什么思路.. 看了题解,是个叫做树分块的奇奇怪怪的操作.. 题解 树分块的研究 #include <cstdio> #include <cstring> ...

  6. 【BZOJ】2456 mode(乱搞)

    Description 给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数. Input 第1行一个正整数n.第2行n个正整数用空格隔开. Output 一行一个正整数表 ...

  7. bzoj 4900 [CTSC2017]密钥 模拟+乱搞

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4900 #include<cstring> #include<cmath&g ...

  8. 【BZOJ-4523】路由表 Trie树 + 乱搞

    4523: [Cqoi2016]路由表 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 155  Solved: 98[Submit][Status][ ...

  9. Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...

随机推荐

  1. 三维重建5:场景中语义分析/语义SLAM/DCNN-大尺度SLAM

    前言: 在实时/非实时大规模三维场景重建中,引入了语义SLAM这个概念,参考三维重建:SLAM的尺度和方法论问题和三维重建:SLAM的粒度和工程化问题 .大规模三维场景重建的尺度增大,因此相对于整个重 ...

  2. Python 遍历目录

    代码: 1.递归使用遍历目录 import os def scanfile(path): filelist = os.listdir(path) allfile = [] for filename i ...

  3. DNN:逻辑回归与 SoftMax 回归方法

    UFLDL Tutorial 翻译系列:http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial 第四章:SoftMax回归 简介: ...

  4. 【技术累积】【点】【git】【10】.gitignore和.gitattributes

    .gitignore 告诉git忽略一些文件,git status会显示不到这些文件的状态. 一般放在项目根目录,以对全局控制,当然可以放在module下: 具体规则主要是: 以行为单位定义忽略文件类 ...

  5. hibernate 回顾

    准备jar包

  6. php 加密解密函数封装

    算法一: //加密函数 function lock_url($txt,$key='yang') { $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi ...

  7. Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维

    Code: #include<bits/stdc++.h> #define maxn 500005 using namespace std; int n,Q,ty,lastans=0; i ...

  8. transparent

    transparent属性用来指定全透明色彩

  9. eas之添加表格列宽自动调整设置

    设置表格整体宽度自动调整为所在panel的宽度 KDTable table=new KDTable(); table. setAutoResize (boolean); 注意:该功能在冻结功能启用后, ...

  10. eas之根据bostype查找实体

    select * from  T_PF_BOSOBJECT;所有实体都有一个唯一的类型ID:BOSTYPEID,8位字符串,可切换到“源代码“页签,查找bostype标签里的值.这个ID的用途主要有: ...