[BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

差分之后就是求多串LCS。

对其中一个串建SAM,然后把其它串放在上面跑。

对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值。答案就是res[]的最大值。

考虑f[x]的求法,把s[]放在SAM上跑时,若下一个能正常匹配(即son[x][c]!=0)则直接len++,否则用经典的跳父亲,找到第一个son[k][c]!=0的点k,len=mx[k]+1,x=son[k][c]。
每次更新最终匹配到的状态的f[]。同时注意到出现次数可以向父亲传递,于是Radixsort之后经典DP转移最长长度即可。

 1 #include<map>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 6 typedef long long ll;
 7 using namespace std;
 8 
 9 const int N=500010;
10 int n,m,x,len,fir,lst=1,cnt=1,ans,res[N],s[N],f[N],mx[N],fa[N],c[N],q[N];
11 map<int,int>son[N];
12 
13 void ext(int c){
14     int p=lst,np=lst=++cnt; mx[np]=mx[p]+1;
15     while (p && !son[p][c]) son[p][c]=np,p=fa[p];
16     if (!p) fa[np]=1;
17     else{
18         int q=son[p][c];
19         if (mx[q]==mx[p]+1) fa[np]=q;
20         else{
21             int nq=++cnt; mx[nq]=mx[p]+1; son[nq]=son[q];
22             while (p && son[p][c]==q) son[p][c]=nq,p=fa[p];
23             fa[nq]=fa[q]; fa[q]=fa[np]=nq;
24         }
25     }
26 }
27 
28 void Radix(){
29     rep(i,1,cnt) c[mx[i]]++;
30     rep(i,1,cnt) c[i]+=c[i-1];
31     for (int i=cnt; i; i--) q[c[mx[i]]--]=i;
32     rep(i,1,cnt) res[i]=mx[i];
33 }
34 
35 void Go(int s[],int n){
36     int x=1,len=0;
37     rep(i,1,n){
38         int c=s[i];
39         if (son[x][c]) x=son[x][c],f[x]=max(f[x],++len);
40         else{
41             while (x && !son[x][c]) x=fa[x];
42             if (!x) x=1,len=0; else len=mx[x]+1,x=son[x][c],f[x]=max(f[x],len);
43         }
44     }
45     for (int i=cnt; i; i--){
46         int x=q[i]; res[x]=min(res[x],f[x]);
47         if (f[x] && fa[x]) f[fa[x]]=mx[fa[x]];
48         f[x]=0;
49     }
50 }
51 
52 int main(){
53     scanf("%d%d%d",&n,&len,&fir);
54     rep(i,1,len-1) scanf("%d",&x),s[i]=x-fir,fir=x;
55     len--; rep(i,1,len) ext(s[i]);
56     Radix();
57     rep(i,2,n){
58         scanf("%d%d",&len,&fir);
59         rep(i,1,len-1) scanf("%d",&x),s[i]=x-fir,fir=x;
60         len--; Go(s,len);
61     }
62     rep(i,2,cnt) ans=max(ans,res[i]);
63     printf("%d\n",ans+1);
64     return 0;
65 }

 

 

转载于:https://www.cnblogs.com/HocRiser/p/9441117.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点对点

数据传输的可靠性是通过数据链路层和网络层的点对点和传输层的端对端保证的。点对点是基于MAC地址或者IP地址&#xff0c;是指一个设备发数据给另外一个设备&#xff0c;这些设备是指直连设备包括网卡&#xff0c;路由器&#xff0c;交换机。端对端是网络连接&#xff0c;应用程…

none

module.exports {root: true,env: {node: true},extends: [plugin:vue/essential, vue/prettier],rules: {no-console: process.env.NODE_ENV production ? error : off,no-debugger: process.env.NODE_ENV production ? error : off,prettier/prettier: [error,{// tab缩…

MQ消息中间件介绍

消息队列技术是分布式应用间交换信息的一种技术&#xff0c;消息队列可驻留在内存或者磁盘上&#xff0c;队列存储消息直到它们被应用程序读走&#xff0c;通过消息队列&#xff0c;应用程序可以独立的执行—它们不需要知道彼此的位置&#xff0c;或者继续执行前不需要等待接收…

22 块级元素和行内元素

学习的初期&#xff0c;我们就要知道&#xff0c;标准文档流等级森严。标签分为两种等级&#xff1a; 行内元素块级元素比如h1标签和span&#xff0c;同时设置宽高&#xff0c;来看浏览器效果&#xff0c;那么你会发现&#xff1a; 行内元素和块级元素的区别&#xff1a;&#…

节流防抖

https://www.cnblogs.com/fsjohnhuang/p/4147810.html 转载于:https://www.cnblogs.com/smzd/p/10943002.html

P3796 【模板】AC自动机(加强版)

题目描述 有 NNN 个由小写字母组成的模式串以及一个文本串 TTT 。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串 TTT 中出现的次数最多。 输入输出格式 输入格式&#xff1a;输入含多组数据。 每组数据的第一行为一个正整数 NNN &#xff0c;表示共有 NNN…

访问数据库优化

例如&#xff1a;工资表里面有全公司人员的工资信息。 现在我需要把这些工资信息打印成工资条。因此需要访问数据库。 1.把整个表全部读取出来&#xff0c;内存处理每个人的工资信息。 2.按照人员单个查询每个人的工资信息。 分析&#xff1a;第一种情况是将所有的人员全部查询…

psql 命令

&#xff08;1&#xff09;使用命令行连接数据库psql -U postgres -h localhost -p 5433 &#xff08;2&#xff09;列出所有的数据库\l -- 查看所有数据库&#xff08;3&#xff09;进入某个数据库\c name -- name是表名(4)列出数据库的所有数据表和视图\d -- 列出所有的数据…

各种缓存介绍

说起缓存相关技术&#xff0c;老多了&#xff0c; memcache、redis、squid、varnish、web cache、 CDN等等。缓存技术五花八门&#xff0c;但这些技术间有什么共性的地方&#xff0c;又有什么不同的地方呢&#xff1f;答案肯定是有的&#xff0c;这次为大家分享及整理一下缓存方…

CentOS6.8 安装node.js npm

环境&#xff1a;CentOS6.8_X64系统 一、到官方下载最新的编译好的安装文件&#xff0c;目前是6.9.4。 $>cd /usr/local/src #定位到这个目录&#xff0c;下载的文件会在这个目录#使用wget下载&#xff08;这个内置命令&#xff09; $>wget https://nodejs.org/dist/v8.1…

[上下界网络流][二分] Bzoj P2406 矩阵

题目描述 输入输出格式 输入格式&#xff1a; 第一行两个数n、m&#xff0c;表示矩阵的大小。 接下来n行&#xff0c;每行m列&#xff0c;描述矩阵A。 最后一行两个数L&#xff0c;R。 输出格式&#xff1a; 第一行&#xff0c;输出最小的答案&#xff1b; 输入输出样例 输入样…

记录自己的nest学习之旅

.a r 转载于:https://www.cnblogs.com/smzd/p/10978807.html

PYTHON 爬虫笔记七:Selenium库基础用法

知识点一&#xff1a;Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统&#xff0c;包含了测试的录制&#xff08;selenium IDE&#xff09;,编写及运行&#xff08;Selenium Remote Control&#xff09;和测试的并行处理&#xff08;Sele…

pyqt5界面切换

#主要的思路就是创建两个frame&#xff08;如果有两个以上同理&#xff09;使用setVisible()函数显示或者隐藏frame 参数是bool值import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import *class logindialog(QDialog):def __init__(sel…

mac 完全卸载vscode

原文分隔线while writing go this morning, I found that the wrong code are not under lined by red line This is really difficult for me and time consuming to keep writing. After 1 hour of wasting time trying to figure out what happened, I decide to kill it al…

RPC简介及框架选择

简单介绍RPC协议及常见框架&#xff0c;对比传统restful api和RPC方式的优缺点。常见RPC框架&#xff0c;gRPC及序列化方式Protobuf等 HTTP协议 http协议是基于tcp协议的&#xff0c;tcp协议是流式协议&#xff0c;包头部分可以通过多出的\r\n来分界&#xff0c;包体部分如何分…

CSS3的calc()使用

什么是calc()? 学习calc()之前&#xff0c;我们有必要先知道calc()是什么&#xff1f;只有知道了他是个什么东东&#xff1f;在实际运用中更好的使用他。 calc()从字面我们可以把他理解为一个函数function。其实calc是英文单词calculate(计算)的缩写&#xff0c;是css3的一个新…

typescript 类型映射 (ReadOnly、Partial)

有时候需要一个类型&#xff0c;是依赖于上一个类型但是&#xff0c;对属性的要求去不同interface Person{name: string;agent: number; } type Person2 Readonly<Person>; type Person3 Partial<Person>; class Test {run() {let person: Person {name: dd,age…

JAVA中几种常用的RPC框架介绍

RPC是远程过程调用的简称&#xff0c;广泛应用在大规模分布式应用中&#xff0c;作用是有助于系统的垂直拆分&#xff0c;使系统更易拓展。Java中的RPC框架比较多&#xff0c;各有特色&#xff0c;广泛使用的有RMI、Hessian、Dubbo等。RPC还有一个特点就是能够跨语言&#xff0…

C#中的多线程 - 同步基础

C#中的多线程 - 同步基础 C#中的多线程 - 同步基础 1同步概要在第 1 部分&#xff1a;基础知识中&#xff0c;我们描述了如何在线程上启动任务、配置线程以及双向传递数据。同时也说明了局部变量对于线程来说是私有的&#xff0c;以及引用是如何在线程之间共享&#xff0c;允许…