传送门

毒瘤出题人,卡我常数

如果后缀排序后将两两之间height\(\ge k\)的后缀放在一组,那么每次询问的答案就是\(\sum_{i} \binom{num[i]}{2}\)(num[i]是第i组后缀在[l,r]之间的后缀个数),这个就是小z的袜子.不过注意块大小要开成\(\frac{n}{\sqrt{m}}\),然后求sa[i]和height[i]可以建出后缀树然后贪心遍历整棵树得到

莫队奇偶快排序比普通的慢

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double using namespace std;
const int N=3e6+10,M=1e5+10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,m,kk,szz;
int xzz[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,3,4,0,0,0,5,6},fa[N<<1],ch[N<<1][7],len[N<<1],id[N<<1],sa[N],tps,ls=1,tt=1;
char cc[N];
il void inst(char cc,int ii)
{
int np=++tt,p=ls;
len[np]=len[p]+1,id[np]=ii,ls=np;
while(p&&!ch[p][xzz[cc-'a']]) ch[p][xzz[cc-'a']]=np,p=fa[p];
if(!p) fa[np]=1;
else
{
int q=ch[p][xzz[cc-'a']];
if(len[q]==len[p]+1) fa[np]=q;
else
{
int nq=++tt;
fa[nq]=fa[q],len[nq]=len[p]+1,fa[q]=fa[np]=nq;
for(int i=0;i<7;++i) ch[nq][i]=ch[q][i];
while(p&&ch[p][xzz[cc-'a']]==q) ch[p][xzz[cc-'a']]=nq,p=fa[p];
}
}
}
int to[N<<1],nt[N<<1],hd[N<<1],tot;
il void add(int x,int y){++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;}
int ff[N<<1],he[N];
il int findf(int x){return ff[x]==x?x:ff[x]=findf(ff[x]);}
void dd(int x)
{
if(id[x]) ++tps,sa[tps]=id[x],he[tps]=len[findf(ls)],ls=x;
for(int i=hd[x];i;i=nt[i]) dd(to[i]);
ff[x]=fa[x];
}
int be[N],p,mm[N],nm[N];
LL na,an[M];
il void ad(int i){na+=nm[be[i]],++nm[be[i]];}
il void dl(int i){--nm[be[i]],na-=nm[be[i]];}
struct qu
{
int l,r,i;
bool operator < (const qu &bb) const {return mm[l]!=mm[bb.l]?l<bb.l:/*((mm[l]&1)?r>bb.r:*/r<bb.r/*)*/;}
}qq[M]; int main()
{
n=rd(),m=rd(),kk=rd();
szz=n/sqrt(m);
scanf("%s",cc+1);
for(int i=1;i<=n;++i) inst(cc[n-i+1],n-i+1);
for(int i=1;i<=tt;++i) add(fa[i],i),ff[i]=i;
ls=0,dd(1);
for(int i=1;i<=n;++i) be[sa[i]]=p+=he[i]<kk,mm[i]=i/szz;
for(int i=1;i<=m;++i) qq[i].l=rd(),qq[i].r=rd(),qq[i].i=i;
sort(qq+1,qq+m+1);
for(int i=1,l=1,r=0;i<=m;++i)
{
while(r<qq[i].r) ++r,ad(r);
while(r>qq[i].r) dl(r),--r;
while(l<qq[i].l) dl(l),++l;
while(l>qq[i].l) --l,ad(l);
an[qq[i].i]=na;
}
for(int i=1;i<=m;++i) printf("%lld\n",an[i]);
return 0;
}

upd:这个代码里面的求sa和height是假的虽然能过

到时再补

luogu P5112 FZOUTSY的更多相关文章

  1. 洛谷P5112 FZOUTSY

    卡map还行.....手写hash表即可. 我一开始以为这个k会变......在sam上想各种奇技淫巧. k不变就是问一段区间有多少对长度为k的子串相同. 然后hash把子串转化为数字,就是区间有多少 ...

  2. P5112 FZOUTSY

    传送门 没想到这题还这能用莫队--本来看看以为复杂度会挂的-- 预处理出每个字母开头往后\(k\)个的字符串的哈希值,然后大概就是那道小z的袜子了 而且据说这题的哈希得用自然溢出 //minamoto ...

  3. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  4. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  5. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  6. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

  7. Luogu 考前模拟Round. 1

    A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...

  8. luogu P2580 于是他错误的点名开始了

    luogu  P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...

  9. CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)

    CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...

随机推荐

  1. Go实战--golang中使用JWT(JSON Web Token)

    http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...

  2. 【洛谷P2709】小B的询问

    题目大意:给定一个长度为 N 的序列,M 个询问,静态查询区间 [l,r] 内的不同颜色数的平方和. 题解:直接莫队即可. 代码如下 #include <bits/stdc++.h> #d ...

  3. Day29--Python--缓冲区, 粘包

    tcp: 属于长连接,与一个客户端进行连接了以后,其他的客户端要等待.要想连接另外一个客户端,需要优雅地断开当前客户端的连接 允许地址重用:server.setsockopt(socket.SOL_S ...

  4. java的集合

    Collection: 1.list ArrayList.Vector.LinkedList ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. Vector是 ...

  5. ES6---扩展运算符和rest‘...’(三点运算符),在数组、函数、set/map等中的应用

    ES6新增的三点运算符,是由三个点表示,在数组中扮演着重要的角色,可以对数组进行合并与分解.可以对set等数据结构进行转换.可以对函数参数进行简化表示,接下来,我们一起揭开其神秘面纱… ●三点—res ...

  6. Linux系统中/etc/rc.local和/etc/rc.d/rc.local的区别

    /etc/rc.d/rc.local 用于添加开机启动命令 /etc/rc.local是/etc/rc.d/rc.local的软连接

  7. win10默认壁纸位置

    win10默认壁纸的位置... --------- win10默认壁纸位置C:\Windows\Web\4K\Wallpaper\Windows win10 默认 锁屏壁纸C:\Windows\Web ...

  8. maven_问题

    问题:was cached in the local repository, resolution will not be reattempted until the update interval ...

  9. Tips and Tricks for Debugging in chrome

    Tips and Tricks for Debugging in chrome Pretty print On sources panel ,clicking on the {} on the bot ...

  10. HTML第三耍 图像标签

    复习一下第二耍: <!doctype html> <html> <head> <meta charset="utf-8"> < ...