Description

新日暮里中,比冲是一位博学的哲学教授。由于最近要帮学生准备考试,他决定弄个提纲给学生。然而同事van不服气,觉得这样学生就没有了自我思考,便在提纲中添加废话。
比冲很无奈,他想找回原稿。我们把现在的提纲看成是一个字符串S。他知道van只会在原稿结尾添加语句,也就是说,原稿是S的前缀。
现在比冲有m个询问,以此来找出原稿。每次给出两个位置l,r,问以l与r结尾的字符串中,有多少个字符串符合原稿的性质,最长的有多长(即:问以l和r结尾的字符串的公共后缀中,有多少个是原串的前缀,
以及公共后缀与原串前缀的最大公共长度。)。

Input

第一行一个只包含小写字母的字符串S,代表被改过的提纲。注意字符串从1开始编号。
第二行一个正整数m,即询问数。
接下来m行,每行两个正整数l,r,即位置。

Output

共m行,每行两个正整数a,b,a表示有多少个合法字符串,b为最长合法字符串长度。

Sample Input

输入1:
nguangdongren
2
5 13
6 10
输入2:
ababbaabbaababab
3
14 16
3 6
2 4

Sample Output

输出1:
1 1
1 2
输出2:
2 4
1 1
1 2

Data Constraint

30%:|S|<=300;m<=300                              
60%: |S|<=3000;m<=100000                    
100%:|S|<=30000;m<=100000

分析

字符串前缀,我们可以想到KMP

然后我们就能想到,l的失配数组往前跳到第一个和r的适配数组往前跳到相同的,那个点就是它们最长公共前缀的点,然后能往前跳多少次就是公共前缀的个数

由于失配数组是一个数组,可以构成一个树的模型,就可以抽象成求LCA和LCA的深度了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int N=3e4+10;
struct Edge {int u,v,nx;
}g[N];
int list[N],cnt;
string s;
int m,len,f[N][20],dep[N];void KMP() {int next=0;f[1][0]=0;g[++cnt]=(Edge){0,1,list[0]};list[0]=cnt;for (int i=1;i<len;i++) {while (next!=0&&s[next]!=s[i]) next=f[next][0];if (s[next]==s[i]) next++;f[i+1][0]=next;g[++cnt]=(Edge){next,i+1,list[next]};list[next]=cnt;}
}void DFS(int u) {for (int i=list[u];i;i=g[i].nx) dep[g[i].v]=dep[u]+1,DFS(g[i].v);
}int LCA(int a,int b) {if (dep[a]<dep[b]) swap(a,b);for (int i=19;i>=0;i--) if (dep[f[a][i]]>=dep[b]) a=f[a][i];if (a==b) return a;for (int i=19;i>=0;i--) if (f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];return f[a][0];
}int main() {cin>>s;len=s.length();KMP();DFS(0);for (int k=1;k<20;k++)for (int i=0;i<=len;i++) f[i][k]=f[f[i][k-1]][k-1];for (scanf("%d",&m);m;m--) {int l,r;scanf("%d%d",&l,&r);int lca=LCA(l,r);printf("%d %d\n",dep[lca],lca);}
}

View Code

转载于:https://www.cnblogs.com/mastervan/p/10902418.html

[KMP][倍增求LCA]JZOJ 4669 弄提纲相关推荐

  1. CodeVS3287[NOIP2013] 货车运输【Kruskal+倍增求LCA】

    题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...

  2. 《信息学奥赛一本通 提高篇》 第四部分 数据结构 第4章 倍增求LCA

    例题1 点的距离 信息学奥赛一本通(C++版)在线评测系统 例题2 暗的连锁(Poj3417) 信息学奥赛一本通(C++版)在线评测系统 LOj10131 暗的连锁_juruo_xlh-CSDN博客 ...

  3. 树上倍增求LCA详解

    LCA(least common ancestors)最近公共祖先 指的就是对于一棵有根树,若结点z既是x的祖先,也是y的祖先(不要告诉我你不知道什么是祖先),那么z就是结点x和y的最近公共祖先. 定 ...

  4. 树上倍增求LCA及例题

    先瞎扯几句 树上倍增的经典应用是求两个节点的LCA 当然它的作用不仅限于求LCA,还可以维护节点的很多信息 求LCA的方法除了倍增之外,还有树链剖分.离线tarjan ,这两种日后再讲(众人:其实是你 ...

  5. POJ 1986:Distance Queries(倍增求LCA)

    http://poj.org/problem?id=1986 题意:给出一棵n个点m条边的树,还有q个询问,求树上两点的距离. 思路:这次学了一下倍增算法求LCA.模板. dp[i][j]代表第i个点 ...

  6. 【代码源 Div1 - 105】#451. Dis(倍增求LCA)

    problem solution 给出 n 个点的一棵树,每个点有各自的点权,m 次询问两个点简单路径所构成点集的异或和. 直接在树上求LCA,把每个点权放进去预处理一下即可. #include< ...

  7. POJ - 1986 Distance Queries 倍增求LCA

    题意还是很有病的,说了半天后边的方向都没用的,意思就是跟样例一样求两点间的距离,裸的LCA 两个点x,y的距离=dis[x]+dis[y]-2*dis[LCA(x,y)]; 三个点x,y,z的距离=d ...

  8. 蓝书4.1-4.4 树状数组、RMQ问题、线段树、倍增求LCA

    这章的数据结构题很真实 T1 排队 bzoj 1699 题目大意: 求静态一些区间的最大值-最小值 思路: ST表裸题 1 #include<iostream> 2 #include< ...

  9. CF 526F Max Mex(倍增求LCA+线段树路径合并)

    Max Mex 题目地址:https://codeforces.com/contest/1084/problem/F 然后合并时注意分情况讨论: 参考代码: 1 #include<bits/st ...

最新文章

  1. windows环境下跑hadoop自带的wordcount遇到的问题
  2. 深入浅出 SpringMVC - 2 提升篇
  3. 如何在fluid中添加自定义控件
  4. 【2018年更新】Sublime text 3安装教程(Windows版本)
  5. KA,连接池居然这么简单?
  6. 捕获SocketConnection组件连接异常的几个好贴
  7. JAVA并发-从缓存一致性说volatile 讲的很好
  8. 玛氏携手阿里 天猫网罗全球快消三巨头
  9. 【11.5校内测试】【倒计时5天】【DP】【二分+贪心check】【推式子化简+线段树】...
  10. 【deep learning学习笔记】注释yusugomori的LR代码 --- LogisticRegression.cpp
  11. 第三次个人赛题目2 【多项式输出格式】
  12. 自有协议的LoRa模块应用
  13. html代码雨特效代码,简易代码雨特效
  14. 用envi对遥感影像进行规则裁剪
  15. 微信公众平台版面设计需要服务器,公众号版面设计,微信公众号中排版怎么弄...
  16. 如何把旧电脑游戏数据迁移到新电脑?
  17. python 调用百度api 文字转语音
  18. php卡死代码,服务器被php进程卡死问题排查-php5.2的curl-bug
  19. 商城系统春节氛围营造
  20. iPad越狱失败 越狱恢复

热门文章

  1. 索尼ELF-SR2解析:27英寸、裸眼3D、4K够不够
  2. 阿里P8都觉得烧脑的是什么数据库 - 绝世好剑(数组的相似约束与实时判定)
  3. Lyft抢先一步IPO,滴滴该何去何从?
  4. python后端面试题2020_2020年ajax面试题及答案(最新),python面试题2020
  5. php输出Resource id #3
  6. Python 把十进制转换为二进制(或八进制、十六进制)
  7. Hive对接Hbase
  8. 【SpringSSM项目】搏击俱乐部 文章发布
  9. 优秀的写作课程免费资源百度网盘分享下载
  10. 在Angular 6.x 中使用ng2-smart-table中的ServerDataSource及添加特殊情况处理