博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初探 回文树
阅读量:6953 次
发布时间:2019-06-27

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

来源:

优点:

  • 代码好写,易于调试
  • 由于是树形,功能强大(不过由于回文串的限制,这类题目比较少)

简述

回文树是两棵树,每个节点代表一个回文串。第一棵树的点是长度为偶数的回文串,那第二棵肯定就是奇数的啦。

为了方便,第一棵树的根是一个长度为\(0\)的串,第二棵就是为\(-1\)的串,不要感到奇怪,就是\(-1\)
可以证明,最多只有\(n\)个结点(\(n\)是串的长度)。这个可以用manacher算法来证明。

如果某结点代表的是串ccabacc,那么它的父亲代表的串就是去掉前后两个字符cabac

每个点还有一个fail指针,表示这个串的后缀中最长的回文串,比如babab的fail指向babbab的指向b

现来讲讲如何构树,方法的思想和KMP,AC自动机没啥两样,看看代码就立马可以懂了。

模板题

我目前刷了个rank7,相信随着这个算法的普及,我要往下跌了。

update

果不其然,现在已经跌到rank25。

#include 
#include
#include
#include
using namespace std;const int MAXN = (int) 3e5 + 3;typedef long long i64;template
void relax(T &a, const T &b) { if (b > a) a = b;}int n;char str[MAXN];struct Node { Node* s[26]; Node* fail; int len; int cnt;};Node mem[MAXN];Node* curMem = mem;Node* getFail(Node* x, int i) { while (i == x->len || str[i] != str[i - x->len - 1]) x = x->fail; return x;}int main() {#ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin);#endif scanf("%s", str); n = strlen(str); Node* root0 = curMem ++; Node* root1 = curMem ++; root0->fail = root1; root1->len = -1; Node* cur = root1; for (int i = 0; i < n; i ++) { int p = str[i] - 'a'; cur = getFail(cur, i); if (! cur->s[p]) { Node* x = curMem ++; cur->s[p] = x; x->len = cur->len + 2; if (cur == root1) x->fail = root0; else x->fail = getFail(cur->fail, i)->s[p]; } cur = cur->s[p]; cur->cnt ++; } i64 ans = 0; for (Node* pt = curMem - 1; pt >= mem; pt --) { if (pt == root0 || pt == root1) continue; pt->fail->cnt += pt->cnt; relax(ans, (i64) pt->len * pt->cnt); } cout << ans << endl; return 0;}

转载于:https://www.cnblogs.com/wangck/p/4369865.html

你可能感兴趣的文章
mysql参数详解
查看>>
hdu1753 java大实数加法
查看>>
抗压力就是一切!!!
查看>>
Listen 0.0.0.0:80 Listen [::0]:80
查看>>
织梦内容模型管理(人才招聘)
查看>>
那天有个小孩跟我说LINQ(三)
查看>>
[AaronYang]C#人爱学不学[2]
查看>>
[ NOI 2005 ] 聪聪与可可
查看>>
Sublime Text 模板插件SublimeTmpl
查看>>
无缝滚动
查看>>
split添加limit参数
查看>>
Tomcat
查看>>
网络编程 - 实现文件传送
查看>>
Python 列表字典制作名册管理
查看>>
学习自查:目录(更新中...)
查看>>
JQuery01
查看>>
Java 详解 JVM 工作原理和流程
查看>>
对大学努力的理解
查看>>
name_save matlab
查看>>
Nginx服务器中的Socket切分,需要的朋友可以参考下
查看>>