博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LOJ#6041】事情的相似度(后缀自动机)
阅读量:5143 次
发布时间:2019-06-13

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

【LOJ#6041】事情的相似度(后缀自动机)

题面

题解

\(\mbox{YCB}\)搬了这道题目。。。\(\mbox{QwQ}\)

还是用到\(lcp\)就是\(parent\)树上的\(LCA\)\(len\)
每次询问显然就是区间内点的贡献。
那么考虑所有可能出现的点对。
显然对于两个子串而言,只会匹配最靠近的两个。
那么用\(set\)维护\(endpos\)集合,每次合并的时候将两个最靠近的位置合并成为一个点对,其贡献就是当前点的\(len\)
那么最终询问扫描线解决即可。
\(zsy\)还有一种用\(LCT\)的做法,大致口胡一下就是类似上面的操作,要求的就是一个链并。每次将当前点到根节点的路径染色,那么每次的交点就是一个\(LCA\)。发现染色操作类似\(LCT\)\(access\),因此直接这么模拟即可。

代码是第一种做法的。

#include
#include
#include
#include
#include
#include
#include
using namespace std;#define ll long long#define MAX 100100inline int read(){ int x=0;bool t=false;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=true,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return t?-x:x;}int n,m;char ch[MAX];struct Node{int son[26],len,ff;}t[MAX<<1];int last,tot,sum;set
S[MAX<<1];void extend(int id,int c){ int p=last,np=++tot;last=np; t[np].len=t[p].len+1; while(p&&!t[p].son[c])t[p].son[c]=np,p=t[p].ff; if(!p)t[np].ff=1; else { int q=t[p].son[c]; if(t[q].len==t[p].len+1)t[np].ff=q; else { int nq=++tot; t[nq]=t[q];t[nq].len=t[p].len+1; t[np].ff=t[q].ff=nq; while(p&&t[p].son[c]==q)t[p].son[c]=nq,p=t[p].ff; } } S[np].insert(id);}struct Point{int u,v,len;}p[MAX<<5];bool operator<(Point a,Point b){return (a.v!=b.v)?a.v
::iterator it,nw,pre,nxt; for(it=S[v].begin();it!=S[v].end();++it) { S[u].insert(*it);nw=pre=nxt=S[u].find(*it);++nxt; if(pre!=S[u].begin())--pre,p[++sum]=(Point){*pre,*nw,t[u].len}; if(nxt!=S[u].end())p[++sum]=(Point){*nw,*nxt,t[u].len}; S[u].erase(*it); } for(it=S[v].begin();it!=S[v].end();++it)S[u].insert(*it); }}struct Qry{int l,r,id;}q[MAX];bool operator<(Qry a,Qry b){return (a.r!=b.r)?a.r

转载于:https://www.cnblogs.com/cjyyb/p/10186921.html

你可能感兴趣的文章
html的解析
查看>>
打印单词长度的直方图--C语言的多种实现
查看>>
PLSql的使用
查看>>
用CAShapeLayer实现一个简单的饼状图(PieView)
查看>>
LA 3644 易爆物
查看>>
uboot 信息解读
查看>>
越是忙的时候,兴趣越多
查看>>
信步漫谈之Eclipse—插件安装
查看>>
字符串和字符数组的输入输出种类对比
查看>>
Python爬虫:抓取手机APP的数据
查看>>
手指滑动屏幕原理
查看>>
对于javascript里面闭包的理解
查看>>
LANMP安装总结
查看>>
因为没有打开的文档,所以这一命令无效==操作word问题
查看>>
C++获取Windows7 32位系统中所有进程名(类似于任务管理器中的进程)
查看>>
团队作业8----第二次项目冲刺(Beta阶段) 第三天
查看>>
用mrpt库时遇到的一个坑
查看>>
【19】235. Lowest Common Ancestor of a Binary Search Tree
查看>>
关闭vs的编译警告
查看>>
opencv载入,显示及保存图像
查看>>