传送门

  好久没刷bzoj惹……

  题意不说可以嘛。

  首先二分答案。

  SAM的事情搞完以后就是dp辣。

  我们已经对于每个位置i,找到了最小的一个k,使得[k,i]这个子串在模版串中出现过。那么我们需要做的是把f[i]给min上f[k]到f[i-x],直接搞是$n^2logn$的,套个数据结构也是两个log的。然而如果一个位置j不在合法的区间中,那么以后也不会进入,那么直接用一个单调队列维护就好了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define MN 1200000
  5. using namespace std;
  6. int read_p,read_ca,read_f;
  7. inline int read(){
  8. read_p=;read_ca=getchar();read_f=;
  9. while(read_ca<''||read_ca>'') read_f=read_ca=='-'?-:read_f,read_ca=getchar();
  10. while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
  11. return read_p*read_f;
  12. }
  13. struct na{int l,f,t[];na(){t[]=t[]=;f=-;}}t[MN<<];
  14. int n,m,la,num=,mi[MN],st[MN];
  15. char s[MN];
  16. inline void add(int x){
  17. int p=++num;t[p].l=t[la].l+;
  18. while (la!=-&&!t[la].t[x]) t[la].t[x]=p,la=t[la].f;
  19. if (la==-) t[p].f=;else{
  20. int o=t[la].t[x];
  21. if (t[o].l==t[la].l+) t[p].f=o;else{
  22. int np=++num;
  23. t[np]=t[o];
  24. t[np].l=t[la].l+;
  25. t[o].f=t[p].f=np;
  26. while (la!=-&&t[la].t[x]==o) t[la].t[x]=np,la=t[la].f;
  27. }
  28. }
  29. la=p;
  30. }
  31. inline bool ju(int x){
  32. mi[]=;
  33. int i,p,l,L=,R=;
  34. for (i=;s[i-];i++) mi[i]=1e9;
  35. for (i=,p=,l=;s[i];i++){
  36. while (p&&!t[p].t[s[i]-'']) p=t[p].f,l=t[p].l;
  37. if (t[p].t[s[i]-'']) p=t[p].t[s[i]-''],l++;
  38. if (i+>=x){
  39. while(L<=R&&mi[i+-x]<=mi[st[R]]) R--;
  40. st[++R]=i+-x;
  41. }
  42. while (L<=R&&st[L]<=i-l) L++;
  43. if (L<=R) if (mi[i+]>mi[st[L]]) mi[i+]=mi[st[L]];
  44. if (mi[i+]>mi[i]+) mi[i+]=mi[i]+;
  45. }
  46. return mi[i]*<=i;
  47. }
  48. int main(){
  49. n=read();m=read();
  50. for (int i=;i<=m;i++){
  51. la=;scanf("%s",s);
  52. for (int j=;s[j];j++) add(s[j]-'');
  53. }
  54. for (int i=;i<=n;i++){
  55. scanf("%s",s);
  56. int l=,r=strlen(s),mid;
  57. while(l<r) if (ju(mid=l+r+>>)) l=mid;else r=mid-;
  58. printf("%d\n",l);
  59. }
  60. }

bzoj 2806: [Ctsc2012]Cheat的更多相关文章

  1. bzoj 2806: [Ctsc2012]Cheat 后缀自动机DP

    2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 583  Solved: 330[Submit][Statu ...

  2. BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]

    2806: [Ctsc2012]Cheat 题意: 多个主串和多个询问串,每次询问将询问串分成多个连续子串,如果一个子串长度>=L且在主串中出现过就是熟悉的 如果熟悉的字符串长度>=询问串 ...

  3. bzoj 2806 [Ctsc2012]Cheat——广义后缀自动机+单调队列优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2806 只想着怎么用后缀数据结构做,其实应该考虑结合其他算法. 可以二分那个长度 L .设当前 ...

  4. BZOJ.2806.[CTSC2012]Cheat(广义后缀自动机 DP 单调队列)

    题目链接 首先二分答案L.然后就是判断能否将原串划分出一些长度不小于L的子串,这些子串要是给定n个串中的某个串的子串,且满足它们的长度之和不小于原串长度的90%. 贪心多长选一段什么的显然不对.老老实 ...

  5. BZOJ 2806 [Ctsc2012]Cheat ——后缀自动机 单调队列优化DP

    先建出广义后缀自动机. 然后跑出文章中每一个位置的最大匹配距离. 然后定义$f[i]$表示匹配到以$i$结尾的串时,最长的匹配距离. 显然可以二分$L$的取值. 然后容易得到$DP$方程 $f[i]= ...

  6. bzoj 2806: [Ctsc2012]Cheat【广义SAM+二分+dp+单调队列】

    把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i- ...

  7. BZOJ 2806 [Ctsc2012]Cheat (后缀自动机+二分+单调队列+dp)

    题目大意: 给你一堆模式串和文本串 对于每个文本串,我们可以把它不可重叠地拆分成很多子串,如果拆分出的串作为子串出现在了任何一个模式串中,我们称它是“眼熟的”,我们必须保证“眼熟的”子串总长度不小于文 ...

  8. BZOJ 2806: [Ctsc2012]Cheat(单调队列优化dp+后缀自动机)

    传送门 解题思路 肯定先要建出来广义后缀自动机.刚开始以为是个二分+贪心,写了一下结果\(20\)分.说一下正解,首先显然\(L_0\)具有单调性,是可以二分的.考虑二分后怎样判合法,对于分割序列很容 ...

  9. 【BZOJ 2806】 2806: [Ctsc2012]Cheat (SAM+二分+DP+单调队列)

    2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1262  Solved: 643 Description ...

随机推荐

  1. ABP .Net Core API和Angular前端APP集成部署

    前言:在ABP官网(https://aspnetboilerplate.com)生成的.Net Core + Angular项目前后端是两个独立的项目,我们可以分开部署,也可以将前端和Web API一 ...

  2. [数据结构]C语言栈的实现

    有始有终,所以我准备把各种数据结构都讲一次,栈也分顺序存储和链式储存,这里我们选择链式存储来讲,顺序存储没有难度(链式其实也是) 作为数据结构中最简单的栈,这里不会说太多,首先考虑一下下面的model ...

  3. Python的文件及异常

    1. Python的文件及异常 1.1 文件操作 1.1.1 从文件中读取数据 许多情况下,我们的信息是存储在文本中的.例如对用户行为的分析,用户访问系统或者网站的访问信息会被存储于文本中,然后对文本 ...

  4. js跳转页面的几种方式

    第一种: window.location.href="http://www.baidu.com"; 第二种: window.history.back(-1); 第三种: windo ...

  5. Webpack 2 视频教程 009 - 配置 ESLint 实现代码规范自动测试 (上)

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  6. docker 保存 加载(导入 导出镜像

    tensorflow 的docker镜像很大,pull一次由于墙经常失败.其实docker 可以将镜像导出再导入. 保存加载(tensorflow)镜像 1) 查看镜像 docker images 如 ...

  7. 利用伪元素:after清除浮动

    一.代码 html代码 <div class="clearfix"></div> css样式 .clearfix{ zoom:1;/*这个属性是为了兼容IE ...

  8. Maven项目不打包*.hbm.xml文件

    <build> <finalName>basic</finalName> <plugins> <plugin> <groupId> ...

  9. PHP生成验证码

    <?php check_code(); function check_code($width = 100, $height = 50, $num = 4, $type = 'jpeg') { $ ...

  10. [Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)

    初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...