[P5496] 【模板】回文自动机(PAM)

蒟蒻开始学回文自动机了

(板子基本靠搬运)

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
struct PAM_Trie {
    int ch[26];
    int fail, len, num;
};
struct PAM {
    PAM_Trie b[N];
    int n, last, cnt, s[N];
    PAM() {
        b[0].len = 0;
        b[1].len = -1;
        b[0].fail = 1;
        b[1].fail = 0;
        last = 0;
        cnt = 1;
    }
    int get_fail(int x) {
        while(s[n - b[x].len - 1] != s[n]) {
            x = b[x].fail;
        }
        return x;
    }
    void insert(char ch) {
        s[++n]=ch;
        int p = get_fail(last);
        if(!b[p].ch[s[n]]) {
            b[++cnt].len = b[p].len + 2;
            int tmp = get_fail(b[p].fail);
            b[cnt].fail = b[tmp].ch[s[n]];
            b[cnt].num = b[b[cnt].fail].num + 1; //
            b[p].ch[s[n]] = cnt;
        }
        last = b[p].ch[s[n]];
    }
} P;
int length;
char c[N];
int main() {
    scanf("%s", c + 1);
    length = strlen(c + 1);
    int k=0;
    P.s[0]=26;
    for(int i=1;i<=length;i++) {
        c[i]=(c[i]-97+k)%26 + 97;
        P.insert(c[i]-'a');
        printf("%d ",P.b[P.last].num);
        k=P.b[P.last].num;
    }
}

原文地址:https://www.cnblogs.com/mollnn/p/12252277.html

时间: 2024-11-09 03:47:20

[P5496] 【模板】回文自动机(PAM)的相关文章

「专题总结」回文自动机PAM

为了备课,把做完的专题的总结咕了这么久... 主要是自己做题做的太慢了,所以讲SAM的时候准备也不充分. 在把讲课时间不断咕之后依然是粗制滥造,锅很多,所以效果很差.而且还有人没听懂... 一半人都做了5道题以上了,另一半人还没怎么看,基本所有人都有预习. 得不到任何反馈,也不知道速度如何.就当凑活吧. 挺失败的.可能也没有下一次机会了. 我也不知道后缀数组推荐率是怎么达到100%的...那次我讲的自己也很满意 一到难的知识点我就不行了嘛...主要是自己理解也很不深刻 至少也还是在3个多小时之内

【回文自动机】bzoj3676 [Apio2014]回文串

回文自动机讲解!http://blog.csdn.net/u013368721/article/details/42100363 pam上每个点代表本质不同的回文子串.len(i)代表长度,cnt(i)代表个数(要最后在fail树上dp一遍方可). 答案直接枚举一遍结点,然后用len(i)*cnt(i),取最大者即可. 回文自动机是非常优越的数据结构,可惜比manacher多一个字符集的空间-- #include<cstdio> #include<cstring> #include

【bzoj3676】[Apio2014]回文串 回文自动机

题目描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最大出现值. 输入 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s. 输出 输出一个整数,为逝查回文子串的最大出现值. 样例输入 [样例输入l] abacaba [样例输入2] www 样例输出 [样例输出l] 7 [样例输出2] 4 题解 回文自动机裸题 关于PAM个人暂时理解不是很深入,挖坑待填. 本题只需要统计fail树的子树大小,再

Palindromic Tree 回文自动机-回文树 例题+讲解

---恢复内容开始--- 回文树,也叫回文自动机,是2014年被西伯利亚民族发明的,其功能如下: 1.求前缀字符串中的本质不同的回文串种类 2.求每个本质不同回文串的个数 3.以下标i为结尾的回文串个数/种类 4.每个本质不同回文串包含的本质不同回文串种类 (本文参考自Palindromic Tree——回文树[处理一类回文串问题的强力工具],Palindromic Tree 回文自动机-回文树 解决回文串的神器) 下面介绍一些数组的意义 next[][]类似于字典树,指向当前字符串在两段同时加

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

题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(transl~l_1~r_1~l_2~r_2\):有两个\(s\)的子串\(s_1=s[l_1\ldots r_1],s_2=s[l_2\ldots r_2]\).你要把\(s_1\)变成\(s_2\).每次允许在左边加一个字符或删一个字符.要求操作次数最少.定义一个字符串是好的当且仅当这个字符串是回文串

回文自动机例题

今天学习了一下回文自动机,吊打\(manacher\)有没有(除了空间) 回文自动机基于这两个性质: 1.一个长度为\(n\)的字符串的本质不同回文子串是\(O(n)\)级别的 2.在一个字符串后增加一个字符后,最多新增\(1\)个本质不同回文子串 这两条性质都可以用归纳法证明 于是我们想到用一个结点来代表一个本质不同的回文串,然后就有\(PAM\)了.和\(AC\)自动机一样,\(PAM\)也有\(fail\)失配边和\(ch\)转移边,\(fail\)代表的是最长回文后缀 采用增量构造法来构

hysbz3676 回文串 回文自动机

回文自动机模板题 头铁了一下午hdu6599,最后发现自己的板有问题 先放这里一个正确性得到基本确认的板,过两天肝hdu6599 #pragma GCC optimize(2) #include<bits/stdc++.h> #include<iostream> #include<cstring> #include<cassert> #define MAXN 300010 #define LL long long #define BASE 2LL #defi

回文自动机入门题

URAL-1960.Palindromes and Super Abilities 传送门 •题意 给你一个长度为 n 的字符串 s,下标从 1 开始: 输出 n 个数,第 i 个数表示 1~i 内有多少个本质不同的回文串: •题解 回文自动机入门题: 定义 ans[ i ] 表示 1~i 共有 $ans_{i}$ 个本质不同的回文串: $ans_{i}=ans_{i-1}$+{第 i 个字符可形成本质不同的回文串 ? 1:0}; •Code 1 #include<bits/stdc++.h>

P3649 [APIO2014]回文串(回文自动机)

回文自动机裸题,把PAM建出来以后对每个节点更新答案即可 代码: #include <bits/stdc++.h> #define int long long #define sc(a) scanf("%lld",&a) #define scc(a,b) scanf("%lld %lld",&a,&b) #define sccc(a,b,c) scanf("%lld %lld %lld",&a,&