[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蛋疼的网卡默认命名实在是让人心碎,所以就想到了要修改网卡名字,步骤如下:(以下步骤涉及到我的错误 ...
随机推荐
- SQL实例_11Oracle基本操作
前言导读 本章介绍了在正常使用Oracle数据库之前进行的常规操作 本章语句的运行需要子啊PLSQL软件中运行 本章导入导出语句需要在虚拟环境中直接运行 1 Oracle创建表空间和用户 --1 创建 ...
- 实时获取股票数据,免费!——Python爬虫Sina Stock实战
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 实时股票数据的重要性 对于四大可交易资产:股票.期货.期权.数字货币来说,期货.期权.数字货币,可以从交 ...
- ArrayList-源码分析-自动扩容机制
ArrayList类: public class ArrayList....{ ...... private static final int DEFAULT_CAPACITY = 10; //默认容 ...
- FastAPI 学习之路(四)
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) 之前的文章分享了如何去在请求中增加参数,本文我们将分享 ...
- Python语法2
目录 选择结构 循环结构 文件读写 函数 类和对象 选择结构 if,elif,else,使用时注意条件的先后顺序 通过缩进四个空格来区分代码块 # 从控制台输入 age = int(input(&qu ...
- UltraSoft - Alpha - Postmortem 事后分析
Alpha阶段 Postmortem会议 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要是解决DDL提醒功能的问题,定义的比较清楚,对典型用户和典 ...
- 计算机网络之IPv4(IPv4分组、IPv4地址、NAT、子网划分与子网掩码、CIDR、ARP协议、DHCP、ICMP)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105138313 学习课程:<2019王道考研计算机网络> 学习目的 ...
- Python课程笔记(七)
今天学习神奇的海龟,非常有意思,还有很多图片想去绘制,分享一个turtle绘图网站: https://www.python123.io/index/turtles/latest , 要是可以分享出源码 ...
- Spring:面向切面编程的AOP
一.前言 除了依赖注入(DI),Spring框架提供的另一个核心功能是对面向方面的编程(AOP)的支持. AOP通常被称为实现横切关注点的工具.横切关注点一词是指应用程序中的逻辑不能与应用程序的其余部 ...
- 『学了就忘』Linux基础 — 8、虚拟机网络模式说明
目录 1.虚拟机网卡 2.网络连接模式对应工作的网卡 3.桥接模式说明 4.补充说明 这篇主要总结一下虚拟机网络配置中桥接模式.NAT模式和仅主机模式的区别. 打开VMware,选中虚拟机,点击网络适 ...