当前位置: 首页 > 编程日记 > 正文

BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3483

【题目大意】

  给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模式,
  题目要求强制在线

【题解】

  我们对于给出的每个字符串正着插入字典树A,倒着插入字典树B,
  对于一个前缀来说,在字典树A上得到的dfs序[st,en]就是所有的匹配串,
  同理,后缀在字典树B上dfs序[st,en]表示所有的后缀匹配串,
  同时满足两者的需提供二维查询,因此我们以Adfsn为版本,Bdfsn为下标建立可持久化线段树,
  查询版本间区间和的差值就是符合条件的答案。

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring> 
#include <vector>
using namespace std;
const int S=2000010,N=2010;
struct Trie{int tot,dfn,st[S],en[S],son[S][26],ansL,ansR;int Tr(char c){return c-'a';}void Init(){for(int i=0;i<=tot;i++)for(int j=0;j<26;j++)son[i][j]=0;dfn=tot=0;}int insert(char *s){int x=0;for(int l=strlen(s),i=0;i<l;i++){if(!son[x][Tr(s[i])])son[x][Tr(s[i])]=++tot;x=son[x][Tr(s[i])];}return x;}void dfs(int x){st[x]=++dfn;for(int i=0;i<26;i++)if(son[x][i])dfs(son[x][i]);en[x]=dfn;}void ask(char *s){int x=0;for(int l=strlen(s),i=0;i<l;i++){if(!son[x][Tr(s[i])]){ansL=ansR=0;return;}x=son[x][Tr(s[i])];}ansL=st[x],ansR=en[x];}
}A;
struct RevTrie{int tot,dfn,st[S],en[S],son[S][26],ansL,ansR;int Tr(char c){return c-'a';}void Init(){for(int i=0;i<=tot;i++)for(int j=0;j<26;j++)son[i][j]=0;dfn=tot=0;}int insert(char *s){int x=0;for(int l=strlen(s),i=l-1;i>=0;i--){if(!son[x][Tr(s[i])])son[x][Tr(s[i])]=++tot;x=son[x][Tr(s[i])];}return x;}void dfs(int x){st[x]=++dfn;for(int i=0;i<26;i++)if(son[x][i])dfs(son[x][i]);en[x]=dfn;}void ask(char *s){int x=0;for(int l=strlen(s),i=l-1;i>=0;i--){if(!son[x][Tr(s[i])]){ansL=ansR=0;return;}x=son[x][Tr(s[i])];}ansL=st[x],ansR=en[x];}
}B;
namespace Persistent_Segment_Tree{int l[N*40],r[N*40],v[N*40],tot,root[S];int change(int x,int a,int b,int c,int p){int y=++tot;v[y]=v[x]+p;if(a==b)return y;int mid=(a+b)>>1;if(c<=mid)l[y]=change(l[x],a,mid,c,p),r[y]=r[x];else l[y]=l[x],r[y]=change(r[x],mid+1,b,c,p);return y;}int query(int x,int a,int b,int c,int d){if(!x)return 0;if(c<=a&&b<=d)return v[x];int mid=(a+b)>>1,res=0;if(c<=mid)res+=query(l[x],a,mid,c,d);if(d>mid)res+=query(r[x],mid+1,b,c,d);return res;}
};
int n,m,posa[N],posb[N];
char s[S];
vector<int> G[S];
int main(){using namespace Persistent_Segment_Tree;scanf("%d",&n);for(int i=1;i<=n;i++){scanf(" %s",s);posa[i]=A.insert(s);posb[i]=B.insert(s);}A.dfs(0); B.dfs(0);for(int i=1;i<=n;i++)G[A.st[posa[i]]].push_back(B.st[posb[i]]);for(int i=1;i<=A.dfn;i++){root[i]=root[i-1];for(int j=0;j<G[i].size();j++)root[i]=change(root[i],1,B.dfn,G[i][j],1);}int ans=0; scanf("%d",&m);while(m--){scanf(" %s",s); int len=strlen(s);for(int i=0;i<len;i++)s[i]=(s[i]-'a'+ans)%26+'a';A.ask(s);  scanf(" %s",s); len=strlen(s);for(int i=0;i<len;i++)s[i]=(s[i]-'a'+ans)%26+'a';B.ask(s);if(A.ansL&&B.ansL)ans=query(root[A.ansR],1,B.dfn,B.ansL,B.ansR)-query(root[A.ansL-1],1,B.dfn,B.ansL,B.ansR);else ans=0;printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/forever97/p/bzoj3483.html

相关文章:

石英晶体振荡器的结构

石英晶体振荡器的结构 石英晶体振荡器是利用石英晶体&#xff08;二氧化硅的结晶体&#xff09;的压电效应制成的一种谐振器件&#xff0c;它的基本构成大致是&#xff1a;从一块石英晶体上按一定方位角切下薄片&#xff08;简称为晶片&#xff0c;它可以是正方形、矩形或圆形等…

坐班族如何摆脱粗壮大腿

对于很多office lady来说一天可能会在办公室坐上八个小时甚至更多的时间&#xff0c;慢慢地会发现大腿越来越粗壮&#xff0c;其实只要认清你大腿的问题真正出在哪里&#xff1f;用一些简单的运动甚至改变坐姿&#xff0c;都可以达到阻止大腿变粗的效果……一起来看看吧&#x…

spark编程基础--2.3面向对象编程基础

类 对象 继承 参数化类型 特质 模式匹配&#xff08;match case类&#xff09; 包 类的定义 构造器 //代码文件为/usr/local/scala/mycode/Counter2.scala class Counter {private var value 0 private var name "" private var step 1 //计算器的默认递进步长 …

网络编程物理层

osi七层协议 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 每层运行常见的物理设备 我们将应用层&#xff0c;表示层&#xff0c;会话层并作应用层&#xff0c;从tcp&#xff0f;ip五层协议的角度来阐述每层的由来与功能&#xff0c;搞清楚了每层的主要协议 就理…

2017高级软件工程第1次作业

第一部分&#xff1a;结缘计算机 1.你为什么选择计算机专业&#xff1f;你认为你的条件如何&#xff1f;和这些博主比呢&#xff1f; 说起来也是阴差阳错&#xff0c;高考填志愿的时候考虑的是当时最火的3个专业&#xff1a;机械、土木、电气。只知道哎呀这个专业好&#xff0c…

微软图表控件MsChart

转自&#xff1a;http://tech.ddvip.com/2008-11/122640479791375.html 昨天在网上看到了微软发布了.NET 3.5框架下的图表控件&#xff0c;第一时间抓下来看了一下&#xff0c;发觉功能很强劲&#xff0c;基本上能想到的图表都可以使用它绘制出来&#xff0c;给图形统计和报表图…

方案里最常用的集群拓扑图(包含:多机集群、负载均衡、双机)

1、san.JPG2、SAN集群.JPG3、不同楼层双机热备.JPG4、纯软双机.JPG5、纯软双机热备备份恢复2.jpg6、多机集群与备份.jpg7、负载均衡.jpg8、负载均衡之数据库均衡.JPG9、工控.JPG10、监控.bmp11、监控应用&#xff08;SCSI&#xff09;.JPG12、容灾.JPG13、双机热备备份恢复1.jp…

基于最短路方法的生物序列比对问题研究

概述 作为生物信息学中的基本组成和重要基础&#xff0c;生物序列比对旨在找出两个或多个生物序列之间的相似性&#xff0c;发现生物序列中的功能、结构和进化信息。 生物序列比对在现实生活中有广泛的应用价值。从核酸和蛋白质序列出发,分析序列中表达结构和功能的生物信息&am…

NOI2003文本编辑器

problem 传送门 Solution 块状链表板子题…… 码了一下午&#xff0c;调了一晚上&#xff0c;代码重构了3遍&#xff0c;在终于过了。 还是太菜了。 移动光标的操作直接模拟即可。 插入操作&#xff0c;先将光标所在块分裂成两块&#xff0c;然后直接插入。 删除操作直接将边角…

spark编程基础--2.4函数式编程基础

foreach遍历操作 映射操作map,flatmap 过滤操作filter 规约操作 reduce,fold方法 拆分操作partition,groupedBy,grouped,sliding Scala入门&#xff1a;函数式编程实例WordCount import java.io.File import scala.io.Source import collection.mutable.Map object WordCount …

开始一点点写博客

今天被老樊问了几个基础的问题&#xff0c;都没回答上来&#xff01;惭愧啊&#xff01;所以决定用博客的方式来记录在学习中的问题以便好复习&#xff0c;增强记忆&#xff01;转载于:https://www.cnblogs.com/MoShin/archive/2008/11/29/1343593.html

无人值守安装win2003+sp2的补丁

1. 无人值守安装win2003sp2的补丁<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />2. 思路&#xff1a; l 第一我们做把sp2的补丁集成到win2003的光盘中l 创建生成无人值守并加载到光盘中l …

构建安全的 ASP.NET 网页和控件

本页内容 本模块内容目标适用范围如何使用本模块威胁和对策设计注意事项输入验证跨站点脚本身份验证授权模拟敏感数据会话管理参数处理异常管理审核和日志记录小结其他资源本模块内容 Web 页和控件位于应用程序的防御前线&#xff0c;它们很容易受到蓄意破坏应用程序安全的攻击…

IDEA新建一个多maven模块工程(有图)

对于一些大型的项目来说&#xff0c;将项目的各个模块理清并进行管理&#xff0c;便于后续项目的维护&#xff0c;使用maven管理是很方便的&#xff0c;它可以很好的构建模块来设计项目的整体结构&#xff0c;对一些小型的项目不建议使用 1、新建父maven模块&#xff08;idea版…

windows10上使用一个tomcat部署2个项目

前言&#xff1a;目前想在本机部署2个项目&#xff0c;网上查了之后&#xff0c;写下本篇随笔 1、准备工作 2、操作方法 3、运行2个项目 1、准备工作 2个war包&#xff08;一个jprss.war和一个jenkins.war&#xff09; 1个tomcat环境 2、操作方法 第一步&#xff1a;复制tomcat…

spark编程基础--4.2在spark-shell中运行代码

启动spark-shell Spark2.1.0入门&#xff1a;Spark的安装和使用 通过spark-submit运行程序

不经历风雨,怎么能见彩虹!马克斯与我的不解之缘!

从***到站长总结经验&#xff08;让你IP飞速飙升的秘诀&#xff09;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />第一章&#xff1a;站长的梦想&#xff01;&#xff01;&#xff01;接触网络比较早&#xff0c;但是真正学到…

centos安装pg以及pg配置ssl

https://blog.csdn.net/iteye_21194/article/details/82645389 https://blog.csdn.net/rudy5348/article/details/79299162 https://yq.aliyun.com/articles/187转载于:https://www.cnblogs.com/diyunpeng/p/10398642.html

使用sbt编译打包,spark-submit命令提交的详细步骤

Spark2.1.0入门&#xff1a;Spark的安装和使用 使用sbt打包Scala程序 该程序依赖 Spark API&#xff0c;因此我们需要通过 sbt 进行编译打包。 请在./sparkapp 中新建文件 simple.sbt&#xff08;vim ./sparkapp/simple.sbt&#xff09;&#xff0c;添加内容如下&#xff0c;…

Tomcat异常退出

tomcat正常运行期间&#xff0c;会出现这样的报错&#xff0c;于是在网上搜了一下&#xff0c;发现有前辈&#xff0c;已找到解决办法&#xff0c;碎不甚明白其中缘由&#xff0c;但先记下&#xff0c;日后深研究&#xff1a; 我的机器的报错内容&#xff1a; SEVERE: Error pr…

[转载]前端工程师应该关注什么

克军发的一张图&#xff0c;汗死我了。http://farm4.static.flickr.com/3025/3114605967_248a0da171_o.png 转载于:https://www.cnblogs.com/cly84920/archive/2008/12/17/4427051.html

组策略分发软件全攻略

组策略分发软件全攻略 在规模比较大的网络环境里面&#xff0c;为了对服务器和客户机上的软件、系统补丁进行集中统一的管理&#xff0c;我们可能会用到SUS、WSUS、SMS等。SUS、WSUS管理系统更新&#xff0c;不在本文讨论&#xff0c;请参考其它相关技术文档。虽然SMS功能较强大…

Saiku二次开发获取源代码在本地编译(五)

关于Saiku的二次开发&#xff0c;在本地编译然后启动自己编译好的Saiku服务 Saiku是开源的&#xff0c;从github上能下载源代码&#xff0c;本例中的saiku源码也是从github上找的&#xff0c;然后自己改了一些pom.xml&#xff0c;以及其它调整。 当前提供的saiku版本为 3.9 一、…

As3.0 一些好书连接

优秀RIA书籍教程推荐与交流平台 http://www.riabook.cn/ 这里有很多不错的书。希望你们有帮助 转载于:https://www.cnblogs.com/guoyiqi/archive/2008/12/19/2069462.html

spark编程基础--5.1RDD编程基础

RDD创建 1.从文件系统中加载数据创建RDD 2.从分布式文件系统HDFS中加载数据 3.通过并行集合&#xff08;数组&#xff09;创建RDD RDD操作 1.转换操作 filter(func) map(func) flatmap(func) groupByKey() reduceByKey(func) 2.行动操作 3.惰性机制 所谓的“惰性机制”是指&…

JMeter的安装和使用

开始学习JMeter&#xff0c;网上资源虽多&#xff0c;不如自己总结的更有意义。 1. JMeter 的安装&#xff1a; 首先要安装java&#xff0c;这个直接去官网下载安装然后添加环境变量即可https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/ &#xff0c;下载JMeter…

C# 3.0 —— 扩展方法

扩展方法是C# 3.0新加入的特性&#xff0c;允许我们在不改变源代码的情况下扩展&#xff08;即填加&#xff09;现有类型中的实例方法&#xff0c;也给我们提供了另外一种扩展类型行为的方法(其它的方法为继承、组合、反射)。 下面我们来看一个代码示例&#xff1a; classProgr…

Melkman's Algorithm

http://cgm.cs.mcgill.ca/~athens/cs601/Melkman.html https://maxgoldste.in/melkman/ 转载于:https://www.cnblogs.com/noryes/p/10406873.html

HDU1051Wooden Sticks

Wooden Sticks http://acm.hdu.edu.cn/showproblem.php?pid1051 #include<stdio.h> struct stick{ int w ; int l; int flag;}wood[5000],temp,r[]; int n ; //排序// int partition(struct stick r[],int first,int end){ int ifirst,jend; while(i<j){ while(i<…

spark编程基础--5.2键值对RDD

键值对RDD的创建 常用的键值对转换操作 reduceByKey(func) groupByKey() keys values sortByKey() mapValues(func) join combineByKey reduceByKey(func) reduceByKey(func)的功能是&#xff0c;使用func函数合并具有相同键的值 groupByKey() 上面得到的wordCountsWithReduce…