时隔一年,第一次学习新的算法

原理和AC自动机差不多

基本思想:

  1. 两棵树分别代表奇偶

  2. 在一个回文串两边同时填上相同字符可以得到另一个回文串,以此构建两棵树

树上维护信息:

  1. 节点表示的回文串为当前位置的最长回文串

  2. 节点上维护当前位置最长回文串的长度,fail指针(当前回文串的最长回文后缀)

如何维护:

  1. 若可以扩展,长度+2 判断条件: s[pos-len-1] == s[pos],否则跳fail

  2. 如何维护fail? 找到第一个可以扩展的位置,连出c边的点即是fail的指向

代码为洛谷模板题

当前节点的答案为他的fail的答案+1(可想而知,感觉而知)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define O(x) cout<<#x<<" "<<x<<endl;
#define B cout<<"Breakpoint"<<endl;
using namespace std;
int read(){
int x = 1,a = 0;char ch = getchar();
while (ch < '0'||ch > '9'){if (ch == '-') x = -1;ch = getchar();}
while (ch >= '0'&&ch <= '9'){a = a*10+ch-'0';ch = getchar();}
return x*a;
}
const int maxn = 5e5+10;
struct node{
int len,fail,ch[30];
}pam[maxn];
char s[maxn];
int n,preNode = 2,tot = 2;
int ans[maxn];
void insert(int pos){
if (pos > 1) s[pos] = (s[pos] - 97 + ans[preNode]) % 26 + 97;
int c = s[pos]-'a';
while (s[pos - pam[preNode].len - 1] != s[pos]) preNode = pam[preNode].fail;
if (pam[preNode].ch[c]) preNode = pam[preNode].ch[c];
else{
int nowNode = ++tot;
pam[preNode].ch[c] = nowNode;
pam[nowNode].len = pam[preNode].len + 2;
if (preNode == 1) pam[nowNode].fail = 2;
else{
for (preNode = pam[preNode].fail;s[pos - pam[preNode].len - 1] != s[pos];preNode = pam[preNode].fail);
pam[nowNode].fail = pam[preNode].ch[c];
}
preNode = nowNode;
}
ans[preNode] = ans[pam[preNode].fail] + 1;
cout<<ans[preNode]<<" ";
}
int main(){
scanf ("%s",s+1);
n = strlen(s+1);
pam[1].len = -1,pam[2].len = 0;
pam[2].fail = 1;
for (int i = 1;i <= n;i++) insert(i);
return 0;
}

算法学习—————PAM回文自动机的更多相关文章

  1. 省选算法学习-回文自动机 && 回文树

    前置知识 首先你得会manacher,并理解manacher为什么是对的(不用理解为什么它是$O(n)$,这个大概记住就好了,不过理解了更方便做$PAM$的题) 什么是回文自动机? 回文自动机(Pal ...

  2. 回文树/回文自动机(PAM)学习笔记

    回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的 ...

  3. 回文树(回文自动机PAM)小结

    回文树学习博客:lwfcgz    poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~ ...

  4. 回文自动机pam

    目的:类似回文Trie树+ac自动机,可以用来统计一些其他的回文串相关的量 复杂度:O(nlogn) https://blog.csdn.net/Lolierl/article/details/999 ...

  5. 洛谷P5496 回文自动机【PAM】模板

    回文自动机模板 1.一个串的本质不同的回文串数量是\(O(n)\)级别的 2.回文自动机的状态数不超过串长,且状态数等于本质不同的回文串数量,除了奇偶两个根节点 3.如何统计所有回文串的数量,类似后缀 ...

  6. URAL 2040 Palindromes and Super Abilities 2 (回文自动机)

    Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...

  7. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...

  8. 【XSY2715】回文串 树链剖分 回文自动机

    题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(tra ...

  9. 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)

    模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...

  10. 【CF932G】Palindrome Partition 回文自动机

    [CF932G]Palindrome Partition 题意:给你一个字符串s,问你有多少种方式,可以将s分割成k个子串,设k个子串是$x_1x_2...x_k$,满足$x_1=x_k,x_2=x_ ...

随机推荐

  1. .net gRPC初探 - 从一个简单的Demo中了解并学习gRPC

    一..NET 上的 gRPC 的简介 gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协 ...

  2. 2021级《JAVA语言程序设计》上机考试试题10

    教学副院长功能页 <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  3. C++练习4 引用的定义与使用

    使用 & 为变量和常量作为引用 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int oneInt ...

  4. 逆天的Zstack-工控机上测试

    放假前一直在服务器上折腾Zstack跑数据库,调IOC.正好手头有个32G内存,intel i7处理器的工控机,就试试装Zstack跑跑看,想着即使重负荷的跑不了,跑跑docker之类的也行.装成功后 ...

  5. sql 查找连续的时间区间以及连续天数

    create table tmptable(rq datetime) go insert tmptable values('2010.1.1') insert tmptable values('201 ...

  6. js 操作符 —— 位操作符详解

    这篇文章不讲一元运算符,也就是 + .-. *. /. =. ||. &&. !这些. 位运算符是在数字底层(即表示数字的32个数位)进行操作的. 有符号整数使用 32 位的前 31 ...

  7. 张量局部保留投影TensorLPP

    Tensor locality preserving projection for hyperspectral image classification 复现的代码python:https://git ...

  8. 百度脑图kityminder

    KityMinder Editor 是一款强大.简洁.体验优秀的脑图编辑工具,适合用于编辑树/图/网等结构的数据. 编辑器由百度 FEX 基于 kityminder-core 搭建,并且在百度脑图中使 ...

  9. bzoj5000+的洛谷题号

    前言 闲得没事把 bzoj5000+ 在 Luogu 上可找到的题面整理了一下-- 对于我,bzoj 连账号都没有,所以肯定是不清楚 bzoj 题目总数的--因此其实就是手动翻查. 工作量很大,基本不 ...

  10. C++程序设计实验二 数组、指针与C++标准库

    Info.hpp文件源码 #include<iostream> #include<string> #include<iomanip> using namespace ...