字符串好难啊不会啊

#include <iostream>
#include <cstdio>
using namespace std;
int n, m, rnk[100005], cnt[100005], tmp[100005], p, mx=128, saa[100005], tot, a, b;
int height[100005], gg[19][100005], mlg[100005], rot[100005], c, d;
char ss[100005];
struct Node{
int l, r, sum;
}nd[2000005];
void sasort(){
for(int i=0; i<mx; i++) cnt[i] = 0;
for(int i=0; i<n; i++) cnt[rnk[i]]++;
for(int i=1; i<mx; i++) cnt[i] += cnt[i-1];
for(int i=n-1; i>=0; i--) saa[--cnt[rnk[tmp[i]]]] = tmp[i];
}
void getSa(){
for(int i=0; i<n; i++){
rnk[i] = ss[i];
tmp[i] = i;
}
sasort();
for(int j=1; p<n; j<<=1){
p = 0;
for(int i=n-j; i<n; i++) tmp[p++] = i;
for(int i=0; i<n; i++)
if(saa[i]>=j)
tmp[p++] = saa[i] - j;
sasort();
swap(rnk, tmp);
p = 1;
rnk[saa[0]] = 0;
for(int i=1; i<n; i++)
if(tmp[saa[i-1]]==tmp[saa[i]] && tmp[saa[i-1]+j]==tmp[saa[i]+j])
rnk[saa[i]] = p - 1;
else
rnk[saa[i]] = p++;
mx = p;
}
}
void getHeight(){
int h=0;
for(int i=0; i<n; i++){
if(h) h--;
int j=saa[rnk[i]-1];
while(ss[i+h]==ss[j+h]) h++;
height[rnk[i]] = h;
}
}
void getRmq(){
for(int i=1; i<=n; i++) gg[0][i] = height[i];
for(int j=1; j<=17; j++)
for(int i=1; i<=n; i++){
if(i+(1<<(j-1))>n) break;
gg[j][i] = min(gg[j-1][i], gg[j-1][i+(1<<(j-1))]);
}
}
int update(int pre, int l, int r, int x){
int re=++tot;
nd[re] = nd[pre];
nd[re].sum++;
if(l==r) ;
else{
int mid=(l+r)>>1;
if(x<=mid) nd[re].l = update(nd[pre].l, l, mid, x);
else nd[re].r = update(nd[pre].r, mid+1, r, x);
}
return re;
}
bool query(int pre, int now, int l, int r, int x, int y){
if(l>=x && r<=y) return nd[now].sum-nd[pre].sum>0;
else{
int mid=(l+r)>>1;
bool re=false;
if(x<=mid) re |= query(nd[pre].l, nd[now].l, l, mid, x, y);
if(mid<y) re |= query(nd[pre].r, nd[now].r, mid+1, r, x, y);
return re;
}
}
int main(){
cin>>n>>m;
scanf("%s", ss);
ss[n++] = 0;
getSa();
n--;
getHeight();
getRmq();
for(int i=1; i<=n; i++)
rot[i] = update(rot[i-1], 1, n, rnk[i-1]);
while(m--){
scanf("%d %d %d %d", &a, &b, &c, &d);
int l=1, r=min(b-a+1, d-c+1), mid, re=0;
while(l<=r){
mid = (l + r) >> 1;
int zuo=rnk[c-1], you=rnk[c-1];
for(int i=17; i>=0; i--)
if(zuo>=(1<<i) && gg[i][zuo-(1<<i)+1]>=mid)
zuo -= 1<<i;
for(int i=17; i>=0; i--)
if(you+(1<<i)<=n && gg[i][you+1]>=mid)
you += 1<<i;
if(query(rot[a-1], rot[b-mid+1], 1, n, zuo, you))
re = mid, l = mid + 1;
else
r = mid - 1;
}
printf("%d\n", re);
}
return 0;
}

loj2059 「TJOI / HEOI2016」字符串的更多相关文章

  1. 「TJOI / HEOI2016」字符串

    「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...

  2. loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增

    题意:给你一个子串,m次询问,每次给你abcd,问你子串sa-b的所有子串和子串sc-d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在paren ...

  3. 【LOJ】#2059. 「TJOI / HEOI2016」字符串

    题解 我们冷静一下,先画一棵后缀树 然后发现我们要给c和d这一段区间在[a,b]这一段开头的串里找lcp 而lcp呢,就是c点的祖先的到根的一段,假如这个祖先的子树里有[a,b - dis[u] + ...

  4. loj#2054. 「TJOI / HEOI2016」树

    题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...

  5. AC日记——#2054. 「TJOI / HEOI2016」树

    #2054. 「TJOI / HEOI2016」树 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include < ...

  6. AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ

    #2057. 「TJOI / HEOI2016」游戏 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include &l ...

  7. loj #2055. 「TJOI / HEOI2016」排序

    #2055. 「TJOI / HEOI2016」排序   题目描述 在 2016 年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个 ...

  8. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  9. LOJ #2058「TJOI / HEOI2016」求和

    不错的推柿子题 LOJ #2058 题意:求$\sum\limits_{i=0}^n\sum\limits_{j=0}^nS(i,j)·2^j·j!$其中$ S(n,m)$是第二类斯特林数 $ Sol ...

随机推荐

  1. 零基础逆向工程29_Win32_03_ESP寻址_定位回调函数_子窗口_消息处理函数

    1 Win32应用程序入口识别 思路:根据WinMain的四个参数,由调用顺序,知道最后压栈的是hInstance句柄(也就是WinMain函数的第一个参数,其值等于ImageBase),根据反汇编, ...

  2. 软件测试Lab 1 Junit and Eclemma

    首先安装eclipse 然后下载hamcrest-core-1.3.jar,下载地址:http://mvnrepository.com/artifact/org.hamcrest/hamcrest-c ...

  3. iOS开发 - 在状态栏显示FPS,CPU和内存信息

    原理 FPS的计算 CoreAnimation有一个很好用的类CADisplayLink,这个类会在每一帧绘制之前调用,并且可以获取时间戳.于是,我们只要统计出,在1s内的帧数即可. - (void) ...

  4. javascript字符串格式化string.format

    String.prototype.format = function () { var values = arguments; return this.replace(/\{(\d+)\}/g, fu ...

  5. windows mysql忘记密码解决方案

    因为mysql很久之前装的,今天突然想用的时候发现密码不记得,怎一个尴尬了得,所以没办法,只能修改一个新的密码.       在此过程中遇到了几个问题      1.没法进入数据库:      2.修 ...

  6. 如何解析比特币中的交易原始数据rawData

    交易数据结构 有关交易的详细信息可以查看比特币的wiki网站:Transaction TxBinaryMap: 原始图片地址 交易的结构表格(Transaction): 示例数据 以一个正式网络的一笔 ...

  7. Android中的Matrix(矩阵)

    写在前面 看这篇笔记之前先看一下参考文章,这篇笔记没有系统的讲述矩阵和代码的东西,参考文章写的也有错误的地方,要辨证的看. 如何计算矩阵乘法 android matrix 最全方法详解与进阶(完整篇) ...

  8. 【BZOJ2730】[HNOI2012] 矿场搭建(找割点)

    点此看题面 大致题意: 一张无向图,要求你在去掉任意一个节点之后,剩余的每个节点都能到达一个救援出口,问至少需要几个救援出口. 第一步:\(Tarjan\)求割点 首先,我们要跑一遍\(Tarjan\ ...

  9. 【BZOJ4196】[NOI2015] 软件包管理器(树链剖分)

    点此看题面 大致题意: 有\(n\)个软件包,它们的依赖关系形成一棵树.现在,问你安装或卸载一个软件包,会影响多少个软件包的安装状态. 树链剖分 这道题应该是 树链剖分 算法比较入门的题目吧. 对于安 ...

  10. 【洛谷2216】[HAOI2007] 理想的正方形(二维RMQ)

    点此看题面 大致题意: 求出一个矩阵中所有\(n*n\)正方形中极差的最小值. 另一种做法 听说这题可以用单调队列去做,但是我写了一个二维\(RMQ\). 二维\(RMQ\) \(RMQ\)相信大家都 ...