4556: [Tjoi2016&Heoi2016]字符串

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 1215  Solved: 484
[Submit][Status][Discuss]

Description

佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物。生日礼物放在一个神奇的箱子中。箱子外边写了
一个长为n的字符串s,和m个问题。佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职加薪,出任CE
O,嫁给高富帅,走上人生巅峰。每个问题均有a,b,c,d四个参数,问你子串s[a..b]的所有子串和s[c..d]的最长公
共前缀的长度的最大值是多少?佳媛姐姐并不擅长做这样的问题,所以她向你求助,你该如何帮助她呢?

Input

输入的第一行有两个正整数n,m,分别表示字符串的长度和询问的个数。接下来一行是一个长为n的字符串。接下来
m行,每行有4个数a,b,c,d,表示询问s[a..b]的所有子串和s[c..d]的最长公共前缀的最大值。1<=n,m<=100,000,
字符串中仅有小写英文字母,a<=b,c<=d,1<=a,b,c,d<=n

Output

对于每一次询问,输出答案。

Sample Input

5 5
aaaaa
1 1 1 5
1 5 1 1
2 3 2 3
2 4 2 3
2 3 2 4

Sample Output

1
1
2
2
2

HINT

Source

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<cstdio>
 7 #define maxn 200010
 8 using namespace std;
 9 int n,m;
10 struct data {
11     int last,cnt;
12     int link[maxn],step[maxn],son[maxn][26];
13     int v[maxn],pos[maxn],fa[maxn][20],w[maxn];
14     int s[maxn*20][2],rt[maxn],t;
15     void insert(int &k,int l,int r,int x) {
16         k=++t;
17         if(l==r) return;
18         int mid=l+r>>1;
19         if(x<=mid) insert(s[k][0],l,mid,x);
20         else insert(s[k][1],mid+1,r,x);
21     }
22     int merge(int x,int y) {
23         if(!x||!y) return x+y;
24         int z=++t;
25         s[z][0]=merge(s[x][0],s[y][0]);s[z][1]=merge(s[x][1],s[y][1]);
26         return z;
27     }
28     bool query(int x,int l,int r,int L,int R) {
29         if(!x) return 0;
30         if(L<=l&&R>=r) return 1;
31         int mid=l+r>>1;
32         if (R<=mid) return query(s[x][0],l,mid,L,R);
33         else if(L>mid) return query(s[x][1],mid+1,r,L,R);
34         else return query(s[x][0],l,mid,L,mid)||query(s[x][1],mid+1,r,mid+1,R);
35     }
36     data() {last=cnt=1;}
37     void extend(int x,int id) {
38         int p=last,np=last=++cnt;step[np]=step[p]+1;insert(rt[np],1,n,id);w[id]=np;
39         while(p&&!son[p][x]) son[p][x]=np,p=link[p];
40         if(!p) link[np]=1;
41         else {
42             int q=son[p][x];
43             if(step[q]==step[p]+1) link[np]=q;
44             else {
45                 int nq=++cnt;
46                 memcpy(son[nq],son[q],sizeof(son[q]));
47                 link[nq]=link[q];
48                 link[q]=link[np]=nq;
49                 step[nq]=step[p]+1;
50                 while(p&&son[p][x]==q) son[p][x]=nq,p=link[p];
51             }
52         }
53     }
54     void pre() {
55         for(int i=1;i<=cnt;i++) v[step[i]]++;
56         for(int i=1;i<=cnt;i++) v[i]+=v[i-1];
57         for(int i=cnt;i;i--) pos[v[step[i]]--]=i;
58         for(int i=cnt;i;i--) {
59             rt[link[pos[i]]]=merge(rt[link[pos[i]]],rt[pos[i]]);
60             fa[pos[i]][0]=link[pos[i]];
61         }
62         for(int j=1;j<=18;j++) for(int i=1;i<=cnt;i++) fa[i][j]=fa[fa[i][j-1]][j-1];
63     }
64     bool check(int mid,int x,int l,int r) {
65         for(int i=18;i>=0;i--) if(step[fa[x][i]]>=mid) x=fa[x][i];
66         return query(rt[x],1,n,l,r);
67     }
68 }a;
69 char ch[maxn];
70 int main() {
71     scanf("%d%d",&n,&m);
72     scanf("%s",ch+1);reverse(ch+1,ch+n+1);
73     for(int i=1;i<=n;i++) a.extend(ch[i]-'a',i);
74     a.pre();
75     for(int i=1;i<=m;i++) {
76         int a1,b1,c1,d1;scanf("%d%d%d%d",&a1,&b1,&c1,&d1);
77         a1=n-a1+1;b1=n-b1+1;c1=n-c1+1;d1=n-d1+1;
78         swap(a1,b1);swap(c1,d1);
79         int l=1,r=min(d1-c1+1,b1-a1+1);
80         while(l<=r) {
81             int mid=l+r>>1;
82             if(a.check(mid,a.w[d1],a1+mid-1,b1)) l=mid+1;
83             else r=mid-1;
84         }
85         printf("%d\n",l-1);
86     }
87 }

View Code

转载于:https://www.cnblogs.com/wls001/p/8404816.html

[BZOJ4556][Tjoi2016Heoi2016]字符串 主席树+二分+倍增+后缀自动机相关推荐

  1. HDU4417 Super Mario(离线树状数组或者主席树+二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. [BZOJ4556][TJOI2016HEOI2016]字符串(二分答案+后缀数组+RMQ+主席树)

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1360  Solved: 545 ...

  3. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)

    Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...

  4. [HEOI2016/TJOI2016]字符串 (后缀数组+主席树+二分)

    description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 n 的字符串 s,和 m 个问题.佳媛姐姐必须正确回答这 m 个问 ...

  5. [2020.11.26NOIP模拟赛]勇者的后缀【SA,RMQ,主席树,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/U142356?contestId=37784 题目大意 一个字符串,询问给出(x,l,r)(x,l,r)(x,l,r ...

  6. Bzoj4556 [Tjoi2016Heoi2016]字符串

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 846  Solved: 327 Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了 ...

  7. P2839-[国家集训队]middle【主席树,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P2839 题目大意 nnn个数字,mmm次询问给出(a,b,c,d)(a,b,c,d)(a,b,c,d)表示左端点在 ...

  8. 主席树 + 树上倍增 ---- codeforces 587C[树上倍增或者主席树]

    题目链接 给定一棵n个点的树,给定m个人(m≤n)在哪个点上的信息,每个点可以有任意个人:然后给q个询问,每次问u到v上的路径有的点上编号最小的k(k≤10)个人(没有那么多人就该有多少人输出多少人) ...

  9. 2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)

    题目链接:点击查看 题目分析:刚看到这个题目的时候,口胡了一个假算法,觉得对于每次询问的操作 [l,r][l,r][l,r] ,只需要找到指令集区间 [l,r][l,r][l,r] 内覆盖到点 kkk ...

最新文章

  1. R语言return返回值的形式实战
  2. flash,sdram 和 cpu 是 T形连接(类似于争的板子上flash和sdram的拓扑结构) --- FLASH搭上SDRAM,并不是你想象的那样不用布等长!...
  3. 安装opencv3.3.0碰到的问题及解决方法
  4. 新手安装linux的磁盘划分
  5. Python基础——PyCharm版本——第一章、PyCharm工具的安装与使用
  6. MapReduce算法–二级排序
  7. 项目微管理17 - 双赢
  8. EXCEL 两列名字 如何快速查看缺少了哪些人名
  9. python配置文件转dict
  10. 腾讯校园招聘笔试 2019-8-17 第三题
  11. python :super 的作用
  12. Atitit 人工智能目前的进展与未来 包含的技术 v2 r99.docx
  13. Python新闻网站项目-3.Gerapy爬虫分布式部署
  14. 批量给多个 Excel 工作簿文件添加文字水印或图片水印
  15. 【游戏开发实战】使用Unity制作水果消消乐游戏教程(一):生成冰块阵列
  16. 外汇EA是什么?EA可靠吗?EA有什么缺点?
  17. Javascript 中文按拼音顺序
  18. mysql 的 虚拟表(DUAL)的介绍及使用场景---条件插入insert
  19. 四核处理器_戴尔这款笔记本彪悍,配置四核处理器,双内存插槽,不足4000元...
  20. win10开机一直转圈圈进不去系统怎么办

热门文章

  1. mysql数据库的打开失败_MySQL数据库启动失败解决
  2. linux tomcat 配置启动命令,# linux 之 配置tomcat开机自启动(systemctl)
  3. git show查看本地文件的修改部分,git diff 如何比较文件,git grep 搜索
  4. python【数据结构与算法】各进制转换-使用内置函数
  5. 黑盒测试和白盒的区别,有哪些常见的白盒黑盒测试方法
  6. Android数据存储方式
  7. 使用idea编写第一个Java程序
  8. db2联邦数据库 linux,DB2创建联邦数据库
  9. html 找不到文件,WebView 加载本地HTML 文件 提示找不到该文件
  10. java 随机数生成实现_Java中生成随机数的实现方法总结