题目链接:点击查看

题目大意:给出一个字符串s,问一共有多少个不同的回文子串

题目分析:咕咕咕了好几个月的回文自动机终于算是学会了,会了之后感觉还是蛮简单的,多练练手加强一下对模板的理解吧,这个题目显然可以用马拉车秒掉,但为了练习一下回文树,还是特地写了一发,效率还是蛮不错的

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;char s[N];int n;struct Palindrome_tree
{int nxt[N][26];int fail[N]; // 当前节点最长回文后缀的节点int len[N]; // 当前节点表示的回文串的长度int cnt[N]; // 当前节点回文串的个数, 在getcnt后可得到全部int sed[N]; // 以当前节点为后缀的回文串的个数(并不是表示第i结尾的回文串的种类数,如果要求每个点结尾的数的回文串个数,得用last)int record[N]; //record记录了节点回文串的结束位置int tot; // 节点个数int last; // 上一个节点void init(){tot = 0;memset(fail, 0, sizeof fail);memset(cnt, 0, sizeof cnt);memset(sed, 0, sizeof sed);memset(len, 0, sizeof len);memset(nxt, 0, sizeof nxt);}void build(){len[0] = 0, len[1] = -1; // 0为偶数长度根, 1为奇数长度根tot = 1, last = 0;fail[0] = 1;}int getfail(char *s, int x, int n){while (s[n - len[x] - 1] != s[n]||n-len[x]-1<0) // 比较x节点回文串新建两端是否相等//n-len[x]-1<0这个是我自己加的,多组的时候光第一个条件是不够的,所以有错请手动删除x = fail[x]; // 若不同, 再比较x后缀回文串两端return x;}void insert(char* s, int n){for (int i = 0; i < n; i++){int c = s[i] - 'a';//全小写要用a 全大写要用A 不然会错int p = getfail(s, last, i);// 得到第i个字符可以加到哪个节点的两端形成回文串if (!nxt[p][c]){tot++;len[tot] = len[p] + 2;  // 在p节点两端添加两个字符fail[tot] = nxt[getfail(s, fail[p], i)][c]; //tot点的后缀回文,可以由上一个节点的后缀回文尝试得到sed[tot] = sed[fail[tot]] + 1; // 以当前节点为结尾的回文串个数nxt[p][c] = tot; // 新建节点}last = nxt[p][c]; // 当前节点成为上一个节点cnt[last]++; //当前节点回文串++record[last] = i;}}void get_cnt(){for (int i = tot; i > 0; i--)cnt[fail[i]] += cnt[i];//fail[i] 的节点 为 i 节点的后缀回文串, 所以个数相加}
}tree;int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);while(scanf("%s",s)!=EOF){n=strlen(s);tree.init();tree.build();tree.insert(s,n);tree.get_cnt();int ans=0;for(int i=1;i<=tree.tot;i++)ans+=tree.cnt[i];printf("%d\n",ans);}return 0;
}

SPOJ - NUMOFPAL Number of Palindromes(回文自动机)相关推荐

  1. 回文树(回文自动机) - URAL 1960 Palindromes and Super Abilities

     Palindromes and Super Abilities Problem's Link:  http://acm.timus.ru/problem.aspx?space=1&num=1 ...

  2. SPOJ - IITKWPCE Let us play with strings(回文自动机+Palindrome Series优化dp)

    题目链接:点击查看 题目大意:给出一个长度为 n 的字符串,问最少拆分成多少个连续的子串,使得每个子串都是一个回文串 题目分析:dp[ i ] 代表 s[ 1 : i ] 的前缀最少可以拆分成多少个连 ...

  3. 论如何优雅的处理回文串 - 回文自动机详解

    写在前面 最近无意中看到了这个数据结构,顺便也就学习了一下. 而且发现网上关于这个算法的描述有很多地方是错的,在这里做了一些更正. 处理字符串的算法很多: KMP,E-KMP,AC自动机,后缀三兄弟: ...

  4. 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门

    缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~  本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...

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

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

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

    回文自动机讲解!http://blog.csdn.net/u013368721/article/details/42100363 pam上每个点代表本质不同的回文子串.len(i)代表长度,cnt(i ...

  7. 算法学习:回文自动机

    [定义] [自动机] 参照AC自动机 [前置知识] [AC自动机] [manacher] 其实不学这两个也可以,但是学过之后会更方便理解 [解决问题] 主要解决回文串的问题 能求出   字符串中回文子 ...

  8. 【知识总结】回文自动机(Palindrome_Automaton)

    参考资料:Palindromic Tree--回文树[处理一类回文串问题的强力工具](请注意,其中似乎有一些错误) 回文自动机似乎和回文树是同一个东西qwq? 回文自动机(PAM)是一种处理回文串的工 ...

  9. BZOJ2342[Shoi2011]双倍回文——回文自动机

    题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...

最新文章

  1. 让vim不要自动添加新的注释行
  2. script标签的defer属性
  3. pytorch 反卷积 可视化_手推反卷积
  4. Fastjson 1.2.66 版本发布,继续加固安全!
  5. 图的两种存储方式---邻接矩阵和邻接表
  6. 2016年深圳市宝安区小一学位申请流程及时间安排
  7. 记一次 .NET 某电商定向爬虫 内存碎片化分析
  8. openshift_OpenShift Origin中的Kubernetes Spark运算符(第1部分)
  9. 无刷新三级联动(ajax)(转)
  10. 查询集 QuerySet
  11. bzoj 4653: [Noi2016]区间(尺取+线段树)
  12. php loop循环 拿到键名
  13. java数组写入excel_java - 如何使用Java将数组数据写入Excel - 堆栈内存溢出
  14. Eye Tracking Methodology Theory and Practice, Third Edition
  15. .Net Framework4 与.Net Framework4.0 client profile区别问题
  16. A. Captain Flint and Crew Recruitment
  17. Ozone数据探查服务Recon2.0设计
  18. Android开发工具系列 --Hosts映射
  19. html5虚拟试衣,Trylive Clothing虚拟试衣系统 打造属于你个人的魔法试衣间
  20. gulp入门详解之基本操作

热门文章

  1. 服务器启动时的leader选举
  2. 解析全局配置文件的时候,做了什么?
  3. MyBatis 源码解读-databaseIdProviderElement()
  4. Quartz源码总结
  5. SpringBoot另一大神器-Actuator
  6. HTTPS证书的申请过程
  7. 通过反射越过泛型检查
  8. 利用solr实现商品的搜索功能
  9. plsql编程语言定义变量
  10. 单例-重写new方法