HDU6599 (字符串哈希+回文自动机)
题意:
求有多少个回文串的前⌈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 (字符串哈希+回文自动机)相关推荐
- HDU-6599 I Love Palindrome String(回文自动机+字符串hash)
题目链接 题意:给定一个字符串\(|S|\le 3\times 10^5\) 对于每个 \(i\in [1,|S|]\) 求有多少子串\(s_ls_{l+1}\cdots s_r\)满足下面条件 \( ...
- HDU - 5658 CA Loves Palindromic(回文自动机/哈希+树状数组)
题目链接:点击查看 题目大意:给出一个字符串 s ,接下来给出 m 个查询,每次查询的形式会给出一个 l 和 r ,问区间 [ l , r ] 内有多少个本质不同的回文子串 题目分析:因为查询的次数比 ...
- 2019ICPC(徐州) - Colorful String(哈希+二分+动态规划/回文自动机)
题目链接:点击查看 题目大意:给出一个字符串,询问该字符串中的所有回文子串中,各有多少不同的字母 题目分析:这个题题意很简单,在比赛的时候看到字符串第一反应是哈希,哈希+暴力+线段树果不其然的T掉了. ...
- 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门
缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~ 本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...
- HDU-6599 I Love Palindrome String 杭电第二次多校赛(Manacher+回文自动机)
HDU-6599 I Love Palindrome String 杭电第二次多校赛(Manacher+回文自动机) 我的博客:https://acmerszq.cn 原题链接:http://acm. ...
- ACM-ICPC 2018 南京赛区网络预赛 I. Skr (马拉车+字符串hash/回文自动机)
题目链接 题意: 给你一个只有0~9的数字组成的字符串,定义一个字符串的价值就是他表示的数字,"120"的价值是120 问你在字符串内不同的回文子串的价值总和是多少 解析: 马拉车 ...
- 「HDU6599 I Love Palindrome String」 - 回文自动机
HDU 6599 I Love Palindrome String tags:回文自动机 题意 让你求有多少个 \([l,r]\) 满足 \(s[l,r]\) 和 \(s\left[l,\frac{l ...
- 【题解】HDU6599 I Love Palindrome String 回文自动机
补一下多校里碰到的字符串题. 来源:2019 HDU Multi-University Training Contest 2 - 09 给定一个字符串S,对于每个i,输出有多少个子串s[l,r]满足以 ...
- CodeForces - 1326D2 Prefix-Suffix Palindrome (Hard version)(马拉车/回文自动机)
题目链接:点击查看 题目大意:给出一个字符串,求出截取前缀和后缀后拼接而成的最长回文串,前缀和后缀不能相交 题目分析:题意很简单,思路也不难想,读完题后我尝试性的看了看样例,发现前缀和后缀拼接后如果能 ...
最新文章
- [k8s] 第一章 十分钟带你理解Kubernetes核心概念
- grafana_mysql安装
- 好文深思:1.3 万亿条数据查询,如何做到毫秒级响应?
- 极光推送android 区分开发测试,给自己的项目做极光推送的步骤
- Tomcat启用HTTPS协议配置过程
- 导购效果跟踪: SPM
- Android开发笔记(三十四)Excel文件的读写
- 产品经理做产品设计的九步法
- paip.java 注解的详细使用代码
- 三菱modbusRTU通讯实例_施耐德PLC常见的两种编程通讯控制实例
- stm32芯片超时无应答解决
- ovito :qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in ““ even though it was found.
- 用DISM为Windows 7 SP1 2019官方英文版添加中文语言包及XHCI驱动
- Latex在线简历制作
- 蓝桥杯真题 - 费解的开关题解
- systemd 简介
- JavaScript中__proto__、prototype和constructor的详细讲解【1】
- sql语句中GROUP BY 和 HAVING的使用 count()
- 处理器后面的字母含义_电脑CPU型号末端的字母是什么意思?让小编来告诉你吧...
- Linux如何安装rpm文件
热门文章
- roast和roasting区别_西餐干加热之有些小复杂的Roast
- 【ES】Elasticsearch分词器使用和简单查询
- 自然资源综合执法案件管理系统(新规程)
- 计算机二级难吗 可以自学不,计算机二级可以自学好过吗
- Java实现企业微信上传临时文件获取media_id
- 开源进展 | WeBASE v1.5.1 发布,支持教学实训场景
- Module not found: Error: Cannot resolve module 'react/lib/ReactMount' in ...
- 谁会嫌钱多啊,最适合学生党的Python兼职攻略以及接私活经验!
- 推荐一本Vue3开发的书
- 迷失中的自己,找一个安静的地方