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-;
#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_pair int dcmp(double x) {
if (fabs(x) < eps) return ;
return (x > ) ? : -;
} typedef long long ll;
typedef unsigned long long ull;
const ull hash1 = ;
const ull hash2 = ;
const int N = + ;
const int M = + ;
const int inf = 0x3f3f3f3f;
const ll mod = ;
ll ret[N];
ull ha[N], pp[N]; ull getha(int l, int r) {
if (l == ) return ha[r];
return ha[r] - ha[l - ] * pp[r - l + ];
} bool check(int l, int r) {
int len = r - l + ;
int mid = (l + r) >> ;
if (len & ) return getha(l, mid) == getha(mid, r);
else return getha(l, mid) == getha(mid + , r);
} struct Palindromic_Tree {
int nxt[N][], fail[N], cnt[N];
int num[N], len[N], s[N], id[N];
int last, n, p; int newnode(int l) {
memset(nxt[p], , sizeof(nxt[p]));
cnt[p] = num[p] = ;
len[p] = l;
return p++;
} void init() {
p = ;
newnode(), newnode(-);
last = n = ;
s[] = -;
fail[] = ;
} int get_fail(int x) {
while (s[n - len[x] - ] != 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] + );
fail[now] = nxt[get_fail(fail[cur])][c];
nxt[cur][c] = now;
num[now] = num[fail[now]] + ;
}
last = nxt[cur][c];
cnt[last]++, id[last] = n;
} ll Count() {
for (int i = p - ; i >= ; i--) cnt[fail[i]] += cnt[i];
for (int i = ; 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 ;
}
} pam; char str[N]; int main() {
pp[] = ;
for (int i = ; i < N; i++) {
pp[i] = hash1 * pp[i - ];
}
while (~scanf("%s", str)) {
memset(ret, , sizeof(ret));
pam.init();
int len = strlen(str);
ha[] = str[];
for (int i = ; i < len; i++) {
pam.add(str[i]);
}
for (int i = ; i < len; i++) {
ha[i] = ha[i - ] * hash1 + str[i];
}
pam.Count();
printf("%lld", ret[]);
for (int i = ; i <= len; i++) {
printf(" %lld", ret[i]);
}
printf("\n");
}
return ;
}
HDU6599 (字符串哈希+回文自动机)的更多相关文章
- hdu多校第二场1009 (hdu6599) I Love Palindrome String 回文自动机/字符串hash
		题意: 找出这样的回文子串的个数:它本身是一个回文串,它的前一半也是一个回文串 输出格式要求输出l个数字,分别代表长度为1~l的这样的回文串的个数 题解: (回文自动机和回文树是一个东西) 首先用回文 ... 
- HDU-6599  I Love Palindrome String(回文自动机+字符串hash)
		题目链接 题意:给定一个字符串\(|S|\le 3\times 10^5\) 对于每个 \(i\in [1,|S|]\) 求有多少子串\(s_ls_{l+1}\cdots s_r\)满足下面条件 \( ... 
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
		模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ... 
- [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机&&hash)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 题目大意为求字符串S有多少个子串S[l,r]满足回文串的定义,并且S[l,(l+r)/2]也满足 ... 
- 2019 Multi-University Training Contest 2  I.I Love Palindrome String(回文自动机+字符串hash)
		Problem Description You are given a string S=s1s2..s|S| containing only lowercase English letters. F ... 
- 回文树(回文自动机PAM)小结
		回文树学习博客:lwfcgz poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~ ... 
- URAL 2040 (回文自动机)
		Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ... 
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
		题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ... 
- [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串
		回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ... 
随机推荐
- [转帖]kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
			kafka入门:简介.使用场景.设计原理.主要配置及集群搭建 http://www.aboutyun.com/thread-9341-1-1.html 还没看完 感觉挺好的. 问题导读: 1.zook ... 
- Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)
			Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ... 
- [LeetCode] 116. 填充每个节点的下一个右侧节点指针
			题目链接 : https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/ 题目描述: 给定一个完美二叉树 ... 
- docker elk
			1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片, ... 
- css发展过程
			https://www.cnblogs.com/dashnowords/p/9460722.html 
- MOVE - 重定位一个游标
			SYNOPSIS MOVE [ direction { FROM | IN } ] cursorname DESCRIPTION 描述 MOVE 在不检索数据的情况下重新定位一个游标. MOVE AL ... 
- 看CLRS 对B树的浅显理解
			定义及特点: 每个结点有n个关键字和n+1个指向子结点的指针,即有n+1个孩子结点. n个关键字按非递减的顺序存储. 最小度数t>=2,除了根结点的所有内部结点(非叶结点)的孩子数>=t且 ... 
- Codeforces Round #430 (Div. 2) - D
			题目链接:http://codeforces.com/contest/842/problem/D 题意:定义Mex为一个序列中最小的未出现的正整数,给定一个长度为n的序列,然后有m个询问,每个询问给定 ... 
- 基本数据类型、包装类、String类型之间的相互转换
			@Testpublic void test2(){//基本数据类型.包装类-->到String类型的转换,调用String类型的静态方法valueOf()即可int i1 = 12;String ... 
- 用递归将嵌套的JSON对象遍历出来,转为二维数组 或一维数组
			var map = new Array();//二维数组 var map2 = new Array();//一维数组 for (var i = 0; i < e.Data.length; i++ ... 
