正题

题目链接:https://www.luogu.com.cn/problem/P4022


题目大意

给出mmm个模板串。

然后nnn次询问给出一个串SSS要求找到一个最大的LLL使得能够将SSS超过90%90\%90%的部分拿出来分后每个串都是某个模板串的子串且长度不小于LLL。

所有输入文件长度不超过 110000011000001100000 字节。字符集为{0,1}\{0,1\}{0,1}


解题思路

先把模板串拿出来构一个广义SAM,然后考虑用这个对串进行匹配。

先对于每个位置求出一个lenilen_ileni​表示一个最长的长度使得iii的后缀是某个模板串的子串。

然后考虑二分一个LLL后进行dpdpdp。

那么有
fi=max{fi−1,fj+i−j}(j∈[i−leni,i−L))f_i=max\{f_{i-1},f_j+i-j\}(\ j\in[i-len_i,i-L)\ )fi​=max{fi−1​,fj​+i−j}( j∈[i−leni​,i−L) )

因为i−lenii-len_ii−leni​单调所以把jjj丢进单调队列里就好了。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1200000;
int n,m,cnt,f[N],q[N],ml[N];
int ch[N][2],len[N],fa[N];
char s[N];
int Insert(int p,int c){if(ch[p][c]){int q=ch[p][c];if(len[p]+1==len[q])return q;else{int nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[q]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;return nq; }}int np=++cnt;len[np]=len[p]+1;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1;else{int q=ch[p][c];if(len[p]+1==len[q])fa[np]=q;else{int nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[q]=fa[np]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}return np;
}
bool check(int L,int n){int head=1,tail=0,ans=0;for(int i=1;i<=n;i++){if(i>=L){int j=i-L;while(head<=tail&&f[j]-j>f[q[tail]]-q[tail])tail--;q[++tail]=j;}while(head<=tail&&q[head]<i-ml[i])head++;f[i]=0;if(head<=tail)f[i]=f[q[head]]+i-q[head];f[i]=max(f[i],f[i-1]);ans=max(ans,f[i]);}return (ans*10>=n*9);
}
int main()
{scanf("%d%d",&n,&m);cnt=1;for(int i=1;i<=m;i++){scanf("%s",s+1);int l=strlen(s+1),x=1;for(int j=1;j<=l;j++)x=Insert(x,s[j]-'0');}while(n--){scanf("%s",s+1);int sl=strlen(s+1),x=1,L=0;for(int i=1;i<=sl;i++){int c=s[i]-'0';while(x&&!ch[x][c]){x=fa[x];L=len[x];}if(x)x=ch[x][c],L++;else x=1,L=0;ml[i]=L;}int l=1,r=sl;while(l<=r){int mid=(l+r)>>1;if(check(mid,sl))l=mid+1;else r=mid-1;}printf("%d\n",r);}return 0;
}

P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】相关推荐

  1. Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列

    传送门 先将所有模板串扔进广义SAM.发现作文的\(L0\)具有单调性,即\(L0\)更小不会影响答案,所以二分答案. 假设当前二分的值为\(mid\),将当前的作文放到广义SAM上匹配. 设对于第\ ...

  2. HDU5470 Typewriter SAM 动态规划 单调队列

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU5470.html 题目传送门 - HDU5470 题意 你需要写一个只包含小写字母的字符串 $s$ . 你 ...

  3. URAL 1427. SMS(DP+单调队列)

    题目链接 我用的比较传统的办法...单调队列优化了一下,写的有点搓,不管怎样过了...两个单调队列,存两个东西,预处理一个标记数组存... 1 #include <iostream> 2 ...

  4. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

  5. 烽火传递(dp+单调队列)

    烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一 ...

  6. [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料

    首先我想吐槽的是题目并没有表明数据范围... 这个题目 DP方程并不难表示. dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] = dp[i-1][k] + (j-k) * c ...

  7. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  8. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 434  Solved: 170 [Submit][Status][Discu ...

  9. Codeforces Round #521 (Div. 3): F. Pictures with Kittens(DP+单调队列)

    题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x,表示你要从中选出刚好x幅画,并且相邻两幅画的距离不能≥k,好看程度之和最大能多少,选不出来输出-1,F1数据范围<200,F2 ...

最新文章

  1. git : 依赖: liberror-perl 但无法安装它
  2. C++走向远洋——39(指向学生类的指针)
  3. IDC:2017年,40%的CIO将失去在企业中的领导地位
  4. 常用小功能(打电话、发短信、发邮件)
  5. 如何以sys用户登录oracle,在Oracle 10g 中如何以sys的身份登录isqlplus页面
  6. BPI:bit for Webduino WEB:Bit 教育版平台正式发布,支持离线安装使用
  7. Android拍照流程
  8. hibernate 学习笔记1
  9. 树状数组相关应用之二元变量结构体组队问题
  10. 机器学习代码实战——K折交叉验证(K Fold Cross Validation)
  11. AJAX实例演示加载xml
  12. 汇编语言Loop指令
  13. yolov5检测图片用detect.py
  14. 同济大学计算机其中考试时间,上海高三上学期期中考试时间一般定在几月份?...
  15. TP6-------对接腾讯云直播
  16. Smartbanner: Intelligent banner design framework that strikes a balance between freedom and rules
  17. airbnb房东_麻烦找房东侵入式监视筛查方法可能是罪魁祸首
  18. NVIDIA显卡,显卡驱动和CUDA版本之间的关系
  19. 雷军:《我十年的程序员生涯》系列之二(我赚的第一桶金)
  20. 数据库 第一章 绪论

热门文章

  1. php 查询数据是否大于,怎么实现从数据查询数据的时候判断如果数据大于N条分次查询 递归吗?...
  2. sql not exists用法_SQL Server 2012 高级用法(一)
  3. c语言逆序数输三个数,C语言求助!一个三位数的逆序数,总是编不对
  4. 软件开发有哪些规范和标准_深圳APP软件开发的流程是什么?
  5. python中def和return是必须使用的保留字吗_Python 保留字和关键字的用法
  6. 实现图片打乱_疫情过后,是否打乱了你前进的脚步?面对现状,你将如何开展新的征程?...
  7. php获取昨日时间段内,PHP 获取 特定时间范围 类
  8. 几何画板自定义工具_几何画板最强版 v5.06 中文版(含教程/实例/控件/打包机/工具集)...
  9. mysql动态扩展_动态可扩展查询MYSQL5.7JSON+虚拟列+Mybatis
  10. acwing——每日一题——总结