博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.4212.神牛的养成计划(Trie 可持久化Trie)
阅读量:4325 次
发布时间:2019-06-06

本文共 2033 字,大约阅读时间需要 6 分钟。

为啥hzw的题也是权限题啊


考虑能够匹配\(s1\)这一前缀的串有哪些性质。对所有串排序,能发现可以匹配\(s1\)的是一段区间,可以建一棵\(Trie\)求出来,设为\([l,r]\)

同理匹配\(s2\)这一后缀的也是一段区间,就可以二维数点了。
然后要求的就是\([l,r]\)中的串匹配\(s2\)的有多少个。把所有串reverse,建一棵可持久化\(Trie\),在上面匹配就可以了。

排序的时候可以不用sort,可以直接在第一棵\(Trie\)上DFS。这样虽然省个\(\log\)但这题\(n\)\(2000\),那个不用边表还有\(26\)的常数=-=。所以直接sort比较的时候暴力一位一位比好了。参考了下。

复杂度\(O(26n)\)。排序复杂度最坏\(O(n|s_i|\log n)\)然而根本到不了。

如果不强制在线,直接离线暴力对集合求交复杂度是线性的吧?


//439336kb  2988ms#include 
#include
#include
#include
#define gc() getchar()#define MAXIN 1000000//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)typedef long long LL;const int N=2e6+5,M=2005;int A[N],L[M],R[M],id[M],root[M];char IN[MAXIN],*SS=IN,*TT=IN;struct Trie{ int tot,son[N][26],L[N],R[N]; void Insert(int *s,int *ed,int id) { for(int x=0; s!=ed; ++s) { x=son[x][*s]?son[x][*s]:(L[++tot]=N,son[x][*s]=tot); L[x]=std::min(L[x],id), R[x]=std::max(R[x],id); } } void Query(int *s,int *ed,int &l,int &r) { int x=0; for(; s!=ed; ++s) if(son[x][*s]) x=son[x][*s]; else {l=-1; return;} l=L[x], r=R[x]; }}T1;struct Trie2{ int tot,son[N][26],sz[N]; void Insert(int *s,int *ed,int &rt,int y)//reverse { for(int x=rt=++tot; s!=ed; --s) { memcpy(son[x],son[y],sizeof son[y]); x=son[x][*s]=++tot, y=son[y][*s], sz[x]=sz[y]+1; } } int Query(int *s,int *ed,int x,int y)//y-x { for(; s!=ed; --s) if(sz[son[y][*s]]-sz[son[x][*s]]>0) x=son[x][*s], y=son[y][*s]; else return 0; return sz[y]-sz[x]; }}T2;inline int read(){ int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-48,c=gc()); return now;}inline bool cmp(int a,int b){ int p1=L[a],p2=L[b],l=std::min(R[a]-p1,R[b]-p2); for(int i=0; i<=l; ++i) if(A[p1+i]!=A[p2+i]) return A[p1+i]

转载于:https://www.cnblogs.com/SovietPower/p/10717200.html

你可能感兴趣的文章
阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门
查看>>
阶段3 2.Spring_04.Spring的常用注解_3 用于创建的Component注解
查看>>
阶段3 2.Spring_04.Spring的常用注解_2 常用IOC注解按照作用分类
查看>>
阶段3 2.Spring_04.Spring的常用注解_5 自动按照类型注入
查看>>
阶段3 2.Spring_04.Spring的常用注解_7 改变作用范围以及和生命周期相关的注解
查看>>
阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例
查看>>
阶段3 2.Spring_04.Spring的常用注解_4 由Component衍生的注解
查看>>
阶段3 2.Spring_06.Spring的新注解_2 spring的新注解-Bean
查看>>
阶段3 2.Spring_04.Spring的常用注解_6 用于注入数据的注解
查看>>
阶段3 2.Spring_06.Spring的新注解_3 AnnotationConfigApplicationContext的使用
查看>>
阶段3 2.Spring_07.银行转账案例_2 案例中添加转账方法并演示事务问题
查看>>
阶段3 2.Spring_07.银行转账案例_6 测试转账并分析案例中的问题
查看>>
阶段3 2.Spring_07.银行转账案例_7 代理的分析
查看>>
阶段3 2.Spring_07.银行转账案例_3 分析事务的问题并编写ConnectionUtils
查看>>
阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_1 AOP的概念
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_4 spring基于XML的AOP-配置步骤
查看>>
阶段3 2.Spring_07.银行转账案例_10 使用动态代理实现事务控制
查看>>