Ural1960 Palindromes and Super Abilities
2016-01-18 21:19
363 查看
嗯,这道题是回文树的裸题。
简单讲一下回文树。
也可以看看这个回文树笔记(转自quack_quack)
下边是这道题的代码:(有几个节点,就有几个回文串)
简单讲一下回文树。
也可以看看这个回文树笔记(转自quack_quack)
struct PAM { int a[MAXN][MAXC], l[MAXN], fa[MAXN], sz, last; /*a就是next数组,一个节点的next[C]节点非空,表示着存在一个回文串在当前节点表示的回文串两边加上各一个字符C。 l表示长度len,在初始化的时候我们要建立两个节点,一个的长度为0,一个的长度为-1。分别表示长度为偶数的回文串和长度为奇数的回文串的fail串 fa表示fail,即失配之后走的边,与sam、acautomation的fail差不多 */ void init() { l[1] = -1; fa[0] = fa[1] = 1; sz = 1; last = 0; } void Insert(int c, int n) { int p = last; while(s[n-l[p]-1] != s ) p = fa[p]; if(a[p][c]) { last = a[p][c]; return; } int q = fa[p], np = ++ sz; l[np] = l[p] + 2; while(s[n-l[q]-1] != s ) q = fa[q]; fa[np] = a[q][c]; a[p][c] = np; last = np; } } pam;
下边是这道题的代码:(有几个节点,就有几个回文串)
#include<cstdio> #define MAXN 200005 #define MAXC 26 char s[MAXN]; struct PAM { int a[MAXN][MAXC], l[MAXN], fa[MAXN], sz, last; void init() { l[1] = -1; fa[0] = fa[1] = 1; sz = 1; last = 0; } void Insert(int c, int n) { int p = last; while(s[n-l[p]-1] != s ) p = fa[p]; if(a[p][c]) { last = a[p][c]; return; } int q = fa[p], np = ++ sz; l[np] = l[p] + 2; while(s[n-l[q]-1] != s ) q = fa[q]; fa[np] = a[q][c]; a[p][c] = np; last = np; } } pam; int main() { scanf("%s", s + 1); pam.init(); for(int i = 1; s[i]; ++ i) { pam.Insert(s[i]-'a', i); printf("%d ", pam.sz-1); } return 0; }
相关文章推荐
- at()函数遍历图像
- svn upgrade
- Django实践:个人博客系统(第七章 Model的设计和使用)
- POJ3067(树状数组:统计数字出现个数)
- activiti工作流入门
- Gradle学习笔记(五)
- 欢迎使用CSDN-markdown编辑器
- HTML5绘图基础_08_绘制多个图形(七巧板)
- Linux下安装Tomcat服务器和部署Web应用
- 安装go环境
- 使用SQL语句 进行数据持久化
- MS project 使用小技巧收集
- Win32API界面库 - Project wheels 工程基础部分完成
- LeetCode:Ugly Number
- 车辆管理系统(九)
- Latex基本使用
- Sass-Ruby及Sass、Compass在Windows下安装
- Java多态性理解
- REG QUERY命令参数(注册表)
- LeetCode-Merge Two Sorted Lists--链接两个有序链表