P5829 【模板】失配树

题目:

题解:

参考题解
我们先想一个问题:如何求出一个字符串的所有border?
如果一个字符串既是 S的前缀又是 S 的后缀,那么我们把 SS 自己平移一下就可以前后重合,然后我们就可以继续匹。。。。。这不就是KMP吗

求两个前缀的最长公共border,
先对原串进行KMP,通过跳两个前缀的next求到两个前缀的所有border
我们通过next数组构建一棵树(发现这就是只有一个字符串的AC自动机的fail树,所有我们也叫它fail树),容易发现两个前缀的最长公共border就是他们在fail树上的LCA

综上所述:

  1. 对原串KMP一遍,求的next数组
  2. 构建fail树
  3. 在fail数上跑LCA

代码:

#include<cstdio>
#include<iostream>
#include<fstream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define Set(a) memset(a,0,sizeof(a))
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define openf(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
#define re register
#define ri re int
#define il inline
typedef long long ll;
typedef unsigned long long ull;
template<typename T> inline T rd(T& x)
{T f=1;x=0;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(T)(c-'0');x*=f;return x;
}
ll rd(){ll x;rd(x);return x;}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
const int inf=1<<30;const int N=1000005;
int next[N],n,m;char s[N];
int fa[N];
int get(int x){return fa[x]==x?x:fa[x]=get(fa[x]);}
void merge(int x,int y){if((x=get(x))!=(y=get(y)))fa[x]=y;}
bool vis[N];
int head[N],to[2*N],nxt[2*N],tot;
void add(int u,int v){to[++tot]=v;nxt[tot]=head[u];head[u]=tot;}//graph
int head2[N],to2[2*N],nxt2[2*N],num[2*N],tot2;
void add2(int u,int v,int w){to2[++tot2]=v;num[tot2]=w;nxt2[tot2]=head2[u];head2[u]=tot2;}//query
int ans[N],x[N],y[N];
void tarjan(int x)
{vis[x]=true;for(ri i=head[x];i;i=nxt[i]) if(!vis[to[i]]) {tarjan(to[i]);merge(to[i],x);}for(ri i=head2[x];i;i=nxt2[i]) if(vis[to2[i]]) ans[num[i]]=get(to2[i]);
}
int main()
{scanf("%s",s+1);n=strlen(s+1);next[0]=next[1]=0;F(i,1,n) fa[i]=i;for(ri i=2,j=0;i<=n;++i){while(j!=0&&s[j+1]!=s[i]) j=next[j];if(s[j+1]==s[i]) ++j;next[i]=j;}F(i,1,n) add(next[i],i);rd(m);F(i,1,m){rd(x[i]);rd(y[i]);add2(x[i],y[i],i);add2(y[i],x[i],i);}tarjan(0);F(i,1,m) printf("%d\n",(ans[i]==x[i]||ans[i]==y[i])?next[ans[i]]:ans[i]);return 0;
}

P5829 【模板】失配树相关推荐

  1. 失配树(border树)

    4和6没有border关系 举例子: 当i = 3时,j = fa[i-1] = fa[2] = 0 s[j+1] = s[1] = a = s[3] 所以把i = 3点的父亲设为j+1 = 1 P5 ...

  2. P3374 【模板】树状数组 1

    P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示 ...

  3. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  4. 最长上升子序列三种模板(n^2模板,二分模板,树状数组模板)

    最长上升子序列(LIS)是动态规划的入门.总结下来,经常用的模板一共有三种,分别为n^2模板,二分模板,树状数组模板. n^2模板代码如下: //n^2算法,本质就是dp,采用二重循环的方式.对于数据 ...

  5. P3374 【模板】树状数组 1( 单点修改 + 区间查询 )

    题目链接:点击进入 题目 思路深入学习 树状数组实现-> 单点修改 + 区间查询 c [ i ] = a ( i - 2 ^ k + 1 ) + - + a [ i ] ( 设节点编号为 i , ...

  6. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  7. [P3374 【模板】树状数组 1](单点修改,区间查询)

    *P3374 [模板]树状数组 1* 第一道线段树的题,很好的板子题,中文体面就不过多解释了. 直接上代码(注释很详细了,前提学过线段树) #include<bits/stdc++.h> ...

  8. P5043 【模板】树同构([BJOI2015]树的同构 // P4323 [JSOI2016]独特的树叶

    一.P5043 [模板]树同构([BJOI2015]树的同构): #include<iostream> #include<cstdio> #include<algorit ...

  9. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

最新文章

  1. SQL case when
  2. HDU2024 C语言合法标识符
  3. 「后端小伙伴来学前端了」关于 Vue中 Slot 插槽的使用,实用且也是组件中必会的一个知识,另外也可以实现父子组件之间通信
  4. GitHub上个最有意思的项目合集(技术清单系列)
  5. [LintCode] Reverse Integer
  6. SAP Cloud Application Programming 编程模型(CAP)的设计准则
  7. java动态代理和cglib动态代理
  8. Android手机用wifi连接adb调试的方法
  9. java mkdir()和mkdirs()区别
  10. 使用trace_event跟踪进程的一生
  11. Oracle数据库中文乱码问题解决
  12. java扩展数组_Java数组扩展
  13. .NET多线程编程(14)——用C#实现蜘蛛/爬虫程序的多线程控制
  14. 菲尼克斯电源模块的安装
  15. 计算机excel还原,Excel文件恢复方法
  16. plist图片列表分割拆分器(修复输出图片错误的BUG)
  17. 旅美见闻:美国贫民百姓众生相
  18. 抽象类可用于创建对象吗_蜈蚣兰,见过吗?可用于口腔炎,鼻窦炎,气管炎,肾盂肾炎...
  19. 该填志愿了,国内大学计算机专业哪家强?
  20. 掌握 Dojo 工具包

热门文章

  1. 机械史上最复杂的巅峰之作,这才是最强大脑!
  2. 有了它,从此成为自带BGM的主角~
  3. android什么是回调,Android中的回调是什么?
  4. cass字体_不动产 准备工作 第一步: 管理CASS码
  5. java虚拟机 山寨机_十年前的山寨机居然有系统?没错,还是纯国产的
  6. ajax 返回flase,Django request.is_ajax返回false
  7. vs code python 插件_工具篇-vscode效率提升插件
  8. 工程勘察设计收费标准2002修订版_黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计招标...
  9. Java当中TreeMap用法
  10. 栈的基础概念与经典题目(Leetcode题解-Python语言)