[bzoj5417]你的名字
1.pp[pos[k]]<len(pos[k]表示k的某一个结束位置),因为不能被匹配
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2000005
4 #define mid (l+r>>1)
5 struct ji{
6 int nex,to;
7 }edge[N];
8 int V,x,last,fa[N],pos[N],len[N],ch[N][26];
9 int VV,E,n,m,a,b,r[N],head[N],pp[N],ls[N*16],rs[N*16];
10 long long ans;
11 char s[N],t[N];
12 int New(){
13 fa[++V]=0;
14 len[V]=pos[V]=0;
15 memset(ch[V],0,sizeof(ch[V]));
16 return V;
17 }
18 void add_edge(int x,int y){
19 edge[E].nex=head[x];
20 edge[E].to=y;
21 head[x]=E++;
22 }
23 void add(int c,int id){
24 int p=last,np=last=New();
25 len[np]=len[p]+1;
26 pos[V]=id;
27 for(;(p)&&(!ch[p][c]);p=fa[p])ch[p][c]=np;
28 if (!p)fa[np]=x;
29 else{
30 int q=ch[p][c];
31 if (len[q]==len[p]+1)fa[np]=q;
32 else{
33 int nq=New();
34 pos[nq]=pos[q];
35 len[nq]=len[p]+1;
36 memcpy(ch[nq],ch[q],sizeof(ch[q]));
37 fa[nq]=fa[q];
38 fa[q]=fa[np]=nq;
39 for(;(p)&&(ch[p][c]==q);p=fa[p])ch[p][c]=nq;
40 }
41 }
42 }
43 void update(int &k,int l,int r,int x){
44 k=++VV;
45 if (l==r)return;
46 if (x<=mid)update(ls[k],l,mid,x);
47 else update(rs[k],mid+1,r,x);
48 }
49 int query(int k,int l,int r,int x,int y){
50 if ((!k)||(l>y)||(x>r))return 0;
51 if ((x<=l)&&(r<=y))return 1;
52 return query(ls[k],l,mid,x,y)|query(rs[k],mid+1,r,x,y);
53 }
54 void merge(int &k1,int k2){
55 if (k1*k2==0){
56 k1+=k2;
57 return;
58 }
59 ls[++VV]=ls[k1];
60 rs[VV]=rs[k1];
61 k1=VV;
62 merge(ls[k1],ls[k2]);
63 merge(rs[k1],rs[k2]);
64 }
65 void dfs(int k){
66 if (pos[k])update(r[k],1,n,pos[k]);
67 for(int i=head[k];i!=-1;i=edge[i].nex){
68 dfs(edge[i].to);
69 merge(r[k],r[edge[i].to]);
70 }
71 }
72 int main(){
73 scanf("%s%d",s,&m);
74 len[0]=-1;
75 n=strlen(s);
76 x=last=New();
77 for(int i=0;s[i];i++)add(s[i]-'a',i+1);
78 memset(head,-1,sizeof(head));
79 for(int i=2;i<=V;i++)add_edge(fa[i],i);
80 dfs(1);
81 x=New();
82 for(int i=1;i<=m;i++){
83 scanf("%s%d%d",t,&a,&b);
84 V=x-1;
85 last=New();
86 for(int j=0,k=1,l=0;t[j];pp[j++]=++l){
87 int c=t[j]-'a';
88 add(c,j);
89 while (!query(r[ch[k][c]],1,n,a+l,b)){
90 if (--l<0)break;
91 if (l==len[fa[k]])k=fa[k];
92 }
93 if (l<0)k=1;
94 else k=ch[k][c];
95 }
96 ans=0;
97 for(int j=x;j<=V;j++)ans+=max(0,len[j]-max(len[fa[j]],pp[pos[j]]));
98 printf("%lld\n",ans);
99 }
100 }
[bzoj5417]你的名字的更多相关文章
- 【BZOJ5417】[NOI2018]你的名字(线段树,后缀自动机)
[BZOJ5417][NOI2018]你的名字(线段树,后缀自动机) 题面 BZOJ 洛谷 题解 首先考虑\(l=1,r=|S|\)的做法,对于每次询问的\(T\)串,暴力在\(S\)串的\(SAM\ ...
- bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并)
bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并) bzoj Luogu 给出一个字符串 $ S $ 及 $ q $ 次询问,每次询问一个字符串 $ T $ ...
- BZOJ5417[Noi2018]你的名字——后缀自动机+线段树合并
题目链接: [Noi2018]你的名字 题目大意:给出一个字符串$S$及$q$次询问,每次询问一个字符串$T$有多少本质不同的子串不是$S[l,r]$的子串($S[l,r]$表示$S$串的第$l$个字 ...
- [BZOJ5417] [NOI2018]你的名字
Description 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外的工作都做好了. 由于ION 已经举办了很多届,所以在题目命名上也是有规定的, ...
- Material Design Reveal effect(揭示效果) 你可能见过但是叫不出名字的小效果
Material Design Reveal effect(揭示效果) 你可能见过但是叫不出名字的小效果 前言: 每次写之前都会来一段(废)话.{心塞...} Google Play首页两个tab背景 ...
- idea怎么设置自己的名字和时间
1.直接修改idea64.exe.vmoptions 里面添加上 -Duser.name=yourname 重启即可生效 1.file - settings-Editor- File and Code ...
- Java名字的由来
Java语言的历程丰富多彩,被现在众多程序员和企业广泛使用,不用质疑这是Java的领先技术的结果. Java是Sun公司开发的一种编程语言,Sun公司最初的方向是让Java来开发一些电器装置程序,如: ...
- iOS获取app图标和启动图片名字(AppIcon and LaunchImage's name)
在某种场景下,可能我们需要获取app的图标名称和启动图片的名称.比如说app在前台时,收到了远程通知但是通知栏是不会有通知提醒的,这时我想做个模拟通知提示,需要用到icon名称:再比如在加载某个控制器 ...
- 【Centos】修改网卡名字&随之出现的问题
自从学了工具tcpdump之后,里面会需要涉及到针对某个网卡抓包,因而会输入网卡名字,可是centOS7蛋疼的网卡默认命名实在是让人心碎,所以就想到了要修改网卡名字,步骤如下:(以下步骤涉及到我的错误 ...
随机推荐
- html行内元素
定义 行内元素只占据它对应标签的边框所包含的空间,没有换行效果 div{ /* 定义行内元素*/ display:inline } 特点 多个元素可以横排显示 不支持宽高和上下margin 支持pad ...
- 题解 「BZOJ4919 Lydsy1706月赛」大根堆
题目传送门 题目大意 给出一个 \(n\) 个点的树,每个点有权值,从中选出一些点,使得满足大根堆的性质.(即一个点的祖先节点如果选了那么该点的祖先节点的权值一定需要大于该点权值) 问能选出来的大根堆 ...
- 禅道开源版 Ldap认证插件开发
禅道开源版-Ldap插件开发 背景 由于开源版无法使用ldap认证,所以在此分享一下自己开发禅道的ldap开发过程,希望对你有所帮助. 简单说一下这个插件的功能: 1.跳过原有禅道认证,使用ldap认 ...
- sql常用的统计公式
hivesql中max,min函数不能作用于多列,因此在有上下门限区间限制时多用公式直接计算. max(x,y)=(x+y+ABS(x-y))/2 min(x,y)=(x+y-ABS(x-y))/2 ...
- 一站式交付体验:云效+Kubernetes
背景 云效依托于阿里巴巴研发效能多年规模化持续交付,赋能云上开发者专为云端用户提供的一站式研发协作平台.Kubernetes,由Google开源的容器集群管理平台,面向运维侧提供自动化的集群和应用管理 ...
- 经典论文系列 | 缩小Anchor-based和Anchor-free检测之间差距的方法:自适应训练样本选择
前言 本文介绍一篇CVPR2020的论文,它在paperswithcode上获得了16887星,谷歌学术上有261的引用次数. 论文主要介绍了目标检测现有的研究进展.anchor-based和 ...
- 974.和可被K整除的子数组
题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满足其元 ...
- RabbitMQ处理未被路由的消息
我们经常使用消息队列进行系统之间的解耦,日志记录等等.但是有时候我们在使用 RabbitMQ时,由于exchange.bindKey.routingKey没有设置正确,导致我们发送给交换器(excha ...
- 搬运1:关于对C语言中数组名取地址加减等操作的一点探究
对于数组名取地址强制转换的操作 偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西. 代码如下: #include<stdio.h> ...
- STM32中按键中断分析
在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入 ...