题目链接:https://cn.vjudge.net/problem/HDU-6599

题解:输出每个长度下的回文串

题解:其实就是对于每一个本质不同的回文串,先判断他是不是符合条件(左一半是不是也是回文,这个可以用马拉车算法判断一下),符合的话,就对应长度累计加和即可。判断的时候,如果数目是偶数,就取中间两个字符的中间添加的字符,否则就取中间的字符。

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
struct PT {int nex[N][26]; // 与字典树类似,指向下一节点int fail[N]; // 失配后跳转的节点int cnt[N]; // 节点i表示本质不同的字符串的个数int num[N]; int len[N]; // 节点表示回文串的长度int S[N]; // 存放添加的字符int last; //上一个字符所在的节点int n; // 字符数组指针int p; // 节点指针int sum; // 本质不同回文串数目 int pid[N];long long Sum;// 新建节点 int newnode (int l) {for (int i = 0; i < 26; i++) nex[p][i] = 0;cnt[p] = 0;num[p] = 0;len[p] = l;return p++; } // 初始化 void init() {p = 0;sum = 0; Sum = 0;newnode(0);newnode(-1);last = 0;n = 0;S[n] = -1;fail[0] = 1;}// 失配后找一个尽可能长的int get_fail(int x) {while(S[n - len[x] - 1] != S[n]) x = fail[x];return x;} void add(int c) {c -= 'a';S[++n] = c;int cur = get_fail(last); // 通过上一个找这个匹配的位置 if(!nex[cur][c]) { // 如果没有出现过,则说明出现了个本质不同的回文串int now = newnode(len[cur] + 2); // 新建节点fail[now] = nex[get_fail(fail[cur])][c];nex[cur][c] = now; num[now] = num[fail[now]] + 1;sum++;}last = nex[cur][c];cnt[last]++;pid[last] = n;}void count() {for(int i = p - 1; i >= 2; i--)cnt[fail[i]] += cnt[i], Sum += cnt[i];}
}a;
char str[N], s[N * 2];
int p[N * 2];
int ans[N];
int lenstr;
void Manacher() {s[0] = '0', s[1] = '#';for(int i = 0; i < lenstr; i++) {s[i * 2 + 2] = str[i];s[i * 2 + 3] = '#';}s[lenstr * 2 + 2] = '1';int maxx = 0 , id;for(int i = 2; i <= lenstr * 2 + 1; i++) {p[i] = maxx > i ? min(p[id - (i - id)], maxx - i) : 1;while(s[i + p[i]] == s[i - p[i]]) p[i]++;if(i + p[i] > maxx) {maxx = i + p[i];id = i;}}
}
bool judge(int pos) {int id;// 其实这两可以合并,为了看起来方便,就不合并了 if(a.len[pos] & 1) {if(((a.len[pos] + 1) / 2 ) & 1) id = (a.pid[pos] - 1 - (a.len[pos] + 1) / 2 / 2) * 2 + 2;elseid = (a.pid[pos] - 1 - (a.len[pos] + 1) / 2 / 2) * 2 + 3;} else {if((a.len[pos] / 2 ) & 1) id = (a.pid[pos] - 1 - a.len[pos] / 2 / 2) * 2 + 2;elseid = (a.pid[pos] - 1 - a.len[pos] / 2 / 2) * 2 + 3;}
//  cout << a.len[pos] << " " << id << " " << p[id] << " " << a.pid[pos] << endl;if(p[id] >= (a.len[pos] + 1) / 2) return true;return false;
}
int main() {while(~scanf("%s", str)) {a.init();lenstr = strlen(str);for(int i = 0; i < lenstr; i ++) {a.add(str[i]);ans[i + 1] = 0;} Manacher();a.count();for(int i = 2; i < a.p; i++) {if(judge(i)) {ans[a.len[i]] += a.cnt[i];}}for(int i = 1; i <= lenstr; i++)printf("%d%c", ans[i], " \n"[i == lenstr]);}return 0;
}

2019HDU多校 I Love Palindrome String HDU - 6599 回文树相关推荐

  1. I Love Palindrome String HDU - 6599 回文树+hash

    题意: 输出每个长度下的回文串(这些回文串的左半边也需要是回文串) 题解: 直接套上回文树,然后每找到一个回文串就将他hash. 因为符合要求的回文串本身是回文串,左半边也是回文串,所以它左半边也右半 ...

  2. 2019牛客暑期多校训练营(第四场)I - String (后缀自动机+回文树)

    题目链接 题意 给一个字符串,求字符串子串的最大集合,集合中字符串互不相等,相等的定义为:a≠ba =\not ba≠​b 而且 a≠rev(b)a =\not rev(b)a≠​rev(b) ...

  3. HDU2019多校第二场 1009(HDU 6599) I Love Palindrome String(回文树(自动机)+manacher)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 解题思路: 回文自动机求每个本质不同的子串出现的次数,同时记录每个节点i代表的回文串第一次出现的 ...

  4. HDU 5157(回文树)

    传送门 题面: Harry got a string T, he wanted to know the number of T's disjoint palindrome substring pair ...

  5. 回文串问题的克星——Palindrome Tree(回文树)/Palindrome Automaton(回文自动机)学习小记

    前言 最近B组有一道我不会的题,赶紧学习. 简介 我们知道,Manacher算法可以在 O(n) O ( n ) O(n)的时间内求出以每个位置为中心的最长回文串(虽然我昨天还不知道Manacher算 ...

  6. C. Palindrome Basis 完全背包 回文串

    链接:https://codeforces.com/contest/1673/problem/C 对于每个回文串,都有取和不取两种作法,而且数量不做限制,故用完全背包. 设i为回文串,则有状态转移方程 ...

  7. 2018 ICPC 南京 M. Mediocre String Problem(ExKMP + Manacher / ExKMP+回文树)

    2018 ICPC 南京 全文见:https://blog.csdn.net/qq_43461168/article/details/112796538 M. Mediocre String Prob ...

  8. HDU - 6599 I Love Palindrome String (回文树+Manacher、回文树+hash)

    题目链接 题意 一个长度为3e5的字符串,求长度为iii的字符串满足字符是回文串而且字符串的前一半也是回文串的个数 思路 回文数求出所有的回文字符串,然后用Manacher或者Hash判断是否符合条件 ...

  9. PAT甲级1136 A Delayed Palindrome :[C++题解]回文串和高精度并输出过程

    文章目录 题目分析 题目链接 题目分析 此题和PAT甲级1024 Palindromic Number:[C++题解]回文串和高精度加法 一样.区别是多了输出整个计算过程. 下面是主要知识点. 一个判 ...

最新文章

  1. JEECG微云快速开发平台
  2. No-PDO-Models-MySQL数据库层抽象类
  3. [计算数学基础]矩阵微分
  4. Exact跻身全球发展最快的云企业行列
  5. Kendall Rank(肯德尔等级)相关系数
  6. MySQL如何查询两个日期之间的记录
  7. webstorm 两个文件对比不同_DOS 入门到精通 使用 fc 命令比较两个文件,并逐一显示不同之处...
  8. HDU - 3538 A sample Hamilton path(最短哈密顿路径+状压dp)
  9. 惠普战66怎么用u盘进入系统_惠普笔记本怎么用u盘启动装系统,空间也要大所以超来超受欢迎!...
  10. 《TCP/IP详解》笔记----第四章 ARP协议
  11. “月宫一号”总设计师刘红:把科幻做成科学
  12. ORACLE 11G DATA GUARD配置之Dataguard简介
  13. django启动服务器失败-已解决
  14. html注册页面代码实现案例,H5制作一个注册页面的代码实例
  15. 第四章 ,数据处理--学习笔记
  16. 【机器人学】机器人动力学参数辨识方法综述
  17. 车联网智能终端GB/T 32960国标协议规范 、国标新能源车联网终端GB/T32960标准T-BOX应用
  18. Java中日期格式化字符串大小写区别YYYY和yyyy
  19. php webshell 木马,消灭php webshell与一句话木马
  20. 数据中心机房效果图鉴赏

热门文章

  1. 独热码转二进制码(含代码)
  2. P2P金融,终将成为主流
  3. 用python画一个简单卡通人物图片_用python画一只可爱的皮卡丘实例
  4. 无刷直流电机方波控制和正弦波控制六步换向控制的区别?
  5. 高校ICT类专业计算机,高校ICT类专业计算机实验室网络系统方案设计.pdf
  6. mkw, 360大牛全面解读PHP面试资源下载
  7. 2021-09-13RC4 加密问题漏洞CVE-2015-2808
  8. python基础教程期末考试题_智慧树Python程序设计基础期末教程考试完整答案
  9. Detected problems with API compatibility(visit g.co/dev/appcompat for more info
  10. Dubbo多注册中心配置