题意:

求有多少个回文串的前⌈len/2⌉个字符也是回文串。(两组解可重复)
将这些回文串按长度分类,分别输出长度为1,2,...,n的合法串的数量。

题解:https://www.cnblogs.com/Cwolf9/p/11253106.html

我们使用回文自动机可以知道本质回文窜的个数与长度,我们在添加一个数组id[i], 记录第i个回文窜的结束位置就可以知道这个回文窜在原窜的区间[L,R];

我们在用字符串哈希就可以快速的判断前⌈len/2⌉个字符是不是回文了

,因为他本身是回文串,因此就是判断前后两部分是否相同

#include "bits/stdc++.h"using namespace std;
const double eps = 1e-8;
#define reg register
#define lowbit(x) x&-x
#define pll pair<ll,ll>
#define pii pair<int,int>
#define fi first
#define se second
#define makp make_pairint dcmp(double x) {if (fabs(x) < eps) return 0;return (x > 0) ? 1 : -1;
}typedef long long ll;
typedef unsigned long long ull;
const ull hash1 = 201326611;
const ull hash2 = 50331653;
const int N = 300000 + 10;
const int M = 1000 + 10;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
ll ret[N];
ull ha[N], pp[N];ull getha(int l, int r) {if (l == 0) return ha[r];return ha[r] - ha[l - 1] * pp[r - l + 1];
}bool check(int l, int r) {int len = r - l + 1;int mid = (l + r) >> 1;if (len & 1) return getha(l, mid) == getha(mid, r);else return getha(l, mid) == getha(mid + 1, r);
}struct Palindromic_Tree {int nxt[N][30], fail[N], cnt[N];int num[N], len[N], s[N], id[N];int last, n, p;int newnode(int l) {memset(nxt[p], 0, sizeof(nxt[p]));cnt[p] = num[p] = 0;len[p] = l;return p++;}void init() {p = 0;newnode(0), newnode(-1);last = n = 0;s[0] = -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 (!nxt[cur][c]) {int now = newnode(len[cur] + 2);fail[now] = nxt[get_fail(fail[cur])][c];nxt[cur][c] = now;num[now] = num[fail[now]] + 1;}last = nxt[cur][c];cnt[last]++, id[last] = n;}ll Count() {for (int i = p - 1; i >= 0; i--) cnt[fail[i]] += cnt[i];for (int i = 2; i < p; i++) {///cout << id[i] - len[i] << " " << id[i] - 1 << endl;
            if (check(id[i] - len[i], id[i] - 1)) {ret[len[i]] += cnt[i];}}return 0;}
} pam;char str[N];int main() {pp[0] = 1;for (int i = 1; i < N; i++) {pp[i] = hash1 * pp[i - 1];}while (~scanf("%s", str)) {memset(ret, 0, sizeof(ret));pam.init();int len = strlen(str);ha[0] = str[0];for (int i = 0; i < len; i++) {pam.add(str[i]);}for (int i = 1; i < len; i++) {ha[i] = ha[i - 1] * hash1 + str[i];}pam.Count();printf("%lld", ret[1]);for (int i = 2; i <= len; i++) {printf(" %lld", ret[i]);}printf("\n");}return 0;
}

View Code

转载于:https://www.cnblogs.com/shuaihui520/p/11435833.html

HDU6599 (字符串哈希+回文自动机)相关推荐

  1. HDU-6599 I Love Palindrome String(回文自动机+字符串hash)

    题目链接 题意:给定一个字符串\(|S|\le 3\times 10^5\) 对于每个 \(i\in [1,|S|]\) 求有多少子串\(s_ls_{l+1}\cdots s_r\)满足下面条件 \( ...

  2. HDU - 5658 CA Loves Palindromic(回文自动机/哈希+树状数组)

    题目链接:点击查看 题目大意:给出一个字符串 s ,接下来给出 m 个查询,每次查询的形式会给出一个 l 和 r ,问区间 [ l , r ] 内有多少个本质不同的回文子串 题目分析:因为查询的次数比 ...

  3. 2019ICPC(徐州) - Colorful String(哈希+二分+动态规划/回文自动机)

    题目链接:点击查看 题目大意:给出一个字符串,询问该字符串中的所有回文子串中,各有多少不同的字母 题目分析:这个题题意很简单,在比赛的时候看到字符串第一反应是哈希,哈希+暴力+线段树果不其然的T掉了. ...

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

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

  5. HDU-6599 I Love Palindrome String 杭电第二次多校赛(Manacher+回文自动机)

    HDU-6599 I Love Palindrome String 杭电第二次多校赛(Manacher+回文自动机) 我的博客:https://acmerszq.cn 原题链接:http://acm. ...

  6. ACM-ICPC 2018 南京赛区网络预赛 I. Skr (马拉车+字符串hash/回文自动机)

    题目链接 题意: 给你一个只有0~9的数字组成的字符串,定义一个字符串的价值就是他表示的数字,"120"的价值是120 问你在字符串内不同的回文子串的价值总和是多少 解析: 马拉车 ...

  7. 「HDU6599 I Love Palindrome String」 - 回文自动机

    HDU 6599 I Love Palindrome String tags:回文自动机 题意 让你求有多少个 \([l,r]\) 满足 \(s[l,r]\) 和 \(s\left[l,\frac{l ...

  8. 【题解】HDU6599 I Love Palindrome String 回文自动机

    补一下多校里碰到的字符串题. 来源:2019 HDU Multi-University Training Contest 2 - 09 给定一个字符串S,对于每个i,输出有多少个子串s[l,r]满足以 ...

  9. CodeForces - 1326D2 Prefix-Suffix Palindrome (Hard version)(马拉车/回文自动机)

    题目链接:点击查看 题目大意:给出一个字符串,求出截取前缀和后缀后拼接而成的最长回文串,前缀和后缀不能相交 题目分析:题意很简单,思路也不难想,读完题后我尝试性的看了看样例,发现前缀和后缀拼接后如果能 ...

最新文章

  1. [k8s] 第一章 十分钟带你理解Kubernetes核心概念
  2. grafana_mysql安装
  3. 好文深思:1.3 万亿条数据查询,如何做到毫秒级响应?
  4. 极光推送android 区分开发测试,给自己的项目做极光推送的步骤
  5. Tomcat启用HTTPS协议配置过程
  6. 导购效果跟踪: SPM
  7. Android开发笔记(三十四)Excel文件的读写
  8. 产品经理做产品设计的九步法
  9. paip.java 注解的详细使用代码
  10. 三菱modbusRTU通讯实例_施耐德PLC常见的两种编程通讯控制实例
  11. stm32芯片超时无应答解决
  12. ovito :qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in ““ even though it was found.
  13. 用DISM为Windows 7 SP1 2019官方英文版添加中文语言包及XHCI驱动
  14. Latex在线简历制作
  15. 蓝桥杯真题 - 费解的开关题解
  16. systemd 简介
  17. JavaScript中__proto__、prototype和constructor的详细讲解【1】
  18. sql语句中GROUP BY 和 HAVING的使用 count()
  19. 处理器后面的字母含义_电脑CPU型号末端的字母是什么意思?让小编来告诉你吧...
  20. Linux如何安装rpm文件

热门文章

  1. roast和roasting区别_西餐干加热之有些小复杂的Roast
  2. 【ES】Elasticsearch分词器使用和简单查询
  3. 自然资源综合执法案件管理系统(新规程)
  4. 计算机二级难吗 可以自学不,计算机二级可以自学好过吗
  5. Java实现企业微信上传临时文件获取media_id
  6. 开源进展 | WeBASE v1.5.1 发布,支持教学实训场景
  7. Module not found: Error: Cannot resolve module 'react/lib/ReactMount' in ...
  8. 谁会嫌钱多啊,最适合学生党的Python兼职攻略以及接私活经验!
  9. 推荐一本Vue3开发的书
  10. 迷失中的自己,找一个安静的地方