博客
关于我
bzoj3439: Kpm的MC密码(四种做法)
阅读量:303 次
发布时间:2019-03-03

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

感想

一开始看错题了。。

然后这题呢,不小心又弄了四个方法,然而我的方法还是最挫的QAQ
挑你们自己喜欢的吧

题解

注意,下文全部的字典树都是倒着建的

1可持久化tri 我的O(nlogn)

你就建一个可持久化tri,然后你就二分一下答案,在1~i这颗字典树上走到这个字符串对应的节点。。

然后看一下出现过多少次就好了,挺简单的

#include
#include
#include
#include
using namespace std;const int N=300005*2;struct qq{ int son[26]; int c;//在多少个串中出现过 }s[N];int num=0;int L[N],R[N],cnt;char s1[N];int n;char ss[N];int root[N];//前i个串void Ins (int &rt1,int x,int rt2){ if (x==-1) return ; if (rt1==0) rt1=++num; s[rt1].c=s[rt2].c+1; int c=ss[x]-'a'; Ins(s[rt1].son[c],x-1,s[rt2].son[c]); for (int u=0;u<26;u++) if (u!=c) s[rt1].son[u]=s[rt2].son[u];}int k;int check (int now,int x)//前多少个字符串 第几个字符串去匹配{ now=root[now]; for (int u=R[x];u>=L[x];u--) { int c=s1[u]-'a'; now=s[now].son[c]; } return s[now].c;}int main(){ s[0].c=0; scanf("%d",&n); for (int u=1;u<=n;u++) { scanf("%s",ss+1);int len=strlen(ss+1); Ins(root[u],len,root[u-1]); L[u]=cnt+1; for (int i=1;i<=len;i++) s1[++cnt]=ss[i]; R[u]=cnt; } for (int u=1;u<=n;u++) { scanf("%d",&k); int ans=-1; int l=1,r=n; while (l<=r) { int mid=(l+r)>>1; if (check(mid,u)>=k) {ans=mid;r=mid-1;} else l=mid+1; } printf("%d\n",ans); } return 0;}

2 乱七八糟的方法O(nlogn)【但是不可以有重复的串】

我们可以吧串从小到大插入,可以知道一个串的Kpm串肯定是在他后面的

于是在后面插的时候如果这个节点之前是别人的终点,你就在别人那里加上自己
最后每个点都可以获得一个集合,拍个序就好了

3 比较优的做法O(n)

大概就是把2的方法,按时间顺序插入,然后我们将他路过的点都加上他自己的信息。。

然后以后某个串的终点的kmp串就是他的终点节点所拥有的信息

4网上烂大街的做法O(nlogn)

就是dfs序+主席树,我也没有认真看,不写了

转载地址:http://tbcq.baihongyu.com/

你可能感兴趣的文章
Java洛谷P5461 赦免战俘讲解
查看>>
关于 form表单 嵌套问题的解决方案
查看>>
论转发与重定向参数传递问题(jsp+servlet项目开发遇到的问题)
查看>>
Spring Boot怎么样处理静态资源(静态资源映射规则)_Web开发
查看>>
Android—— log.e(),log.d(),log.i()等的区别
查看>>
js中时间戳转时间格式
查看>>
JS中的数据类型
查看>>
位运算
查看>>
MarkDown
查看>>
线性代数 16 向量空间
查看>>
nginx 配置实例 - 反向代理(1)
查看>>
【数字电路抢救】1 逻辑代数基础(3)同或 异或
查看>>
c++ 函数化 面向对象
查看>>
【无需额外安装插件】vscode 同步插件、设置、UI状态 | 超简单方法
查看>>
【unity shader 入门精要】CH2 渲染流水线
查看>>
【unity shader 入门精要】CH7 基础纹理
查看>>
Linux运维技术之RAID配置
查看>>
java学习笔记6:windows、linux安装配置jdk
查看>>
java学习笔记24:文档注释与代码块
查看>>
java学习笔记31:Arrays类介绍使用
查看>>