[学习笔记]回文算法
Manacher
Manacher用以解决一类对每个中心求解其左右两端最长的回文串。
考虑我们先把所有两个字符之间都插入一个不在字符集里的字符,这样就可以不用考虑中心在字符中间的情况,即可以直接枚举中心。
考虑如何使用已知的信息操作。
若我们求
其复杂度为
点击查看代码
s[0] = '~';
a = getchar();
while(a <= 'z' && a >= 'a'){
s[++len] = '|';
s[++len] = a;
a = getchar();
}
s[++len] = '|';
for(int i = 1;i <= len;++i){
if(m + ans[m] >= i)
ans[i] = std::min(m + ans[m] - i,ans[m * 2 - i]);
while(s[i - ans[i]] == s[i + ans[i]]) ans[i] ++ ;
if(ans[i] + i > m + ans[m])m = i;
if(fans < ans[i])
fans = ans[i];
}
std::cout<<fans - 1;
回文自动机
和其他自动机类似的,回文树也由转移边和后缀连接组成,每个节点都可以代表一个回文子串。
考虑回文串分为奇偶串。
一个节点的
顺带在每个节点维护此节点对应的回文子串的长度。
建造
回文树有两个初始阶段,分别表示长度为
偶根的
类似后缀自动机,增量构造回文树。
考虑构造
我们从以上一个字符结尾的最长回文串对应的节点开始,不断沿着
然后根据这个点是否存在新建节点。
然后要求出这个点的
如果
根据
点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
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, length, last, cnt, s[N];
char c[N];
PAM()
{
b[0].len = 0; b[1].len = -1;
b[0].fail = 1; b[1].fail = 0;
last = 0;
cnt = 1;
}
void read()
{
scanf("%s", c + 1);
length = strlen(c + 1);
}
int get_fail(int x)
{
while(s[n - b[x].len - 1] != s[n])
{
//printf("%d %d %d\n", x, n - b[x].len - 1, b[x].fail);
x = b[x].fail;
}
return x;
}
void insert()
{
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]];
}
void solve()
{
int k = 0;
s[0] = 26;
for(n = 1; n <= length; n++)
{
c[n] = (c[n] - 97 + k) % 26 + 97;
s[n] = c[n] - 'a';
insert();
printf("%d ", b[last].num);
k = b[last].num;
}
}
}P;
int main()
{
P.read();
P.solve();
return 0;
}
本文作者:fhq_treap
本文链接:https://www.cnblogs.com/dixiao/p/15919521.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】