拖了很久才补的回文树,感觉网上的博客都是一个做法。。回文树统计不同种类的回文串出现次数,然后用字符串hash来判每个回文子串是否符合要求

#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
#define mod 19260817
#define ll long long
#define P 131
char s[maxn];
ll len,F[maxn],h[maxn]; ll has(int l,int r){
return (h[r]-h[l-]*F[r-l+]%mod+mod)%mod;
} struct PAM{
int nxt[maxn][],fail[maxn];
int len[maxn],S[maxn];
int cnt[maxn],num[maxn];
int n,p,last,id[maxn];//记录第i个结点的后缀下标
int newnode(int l){
memset(nxt[p],,sizeof nxt[p]);
len[p]=l;
cnt[p]=num[p]=;
return p++;
}
void init(){
memset(cnt,,sizeof cnt);
memset(num,,sizeof num);
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 ans[maxn];
ll count(){
memset(ans,,sizeof ans);
for(int i=p-;i>=;i--)cnt[fail[i]]+=cnt[i]; for(int i=;i<p;i++){
int L=id[i]-len[i],R=id[i]-;
int mid=(L+R)/;
ll tmp1=has(L,mid)%mod;
ll tmp2;
if(len[i]%==)
tmp2=has(mid+,R)%mod;
else tmp2=has(mid,R)%mod;
if(tmp1==tmp2)
ans[len[i]]+=cnt[i];
}
}
}tr;
int main(){
F[]=;
for(int i=;i<=;i++)F[i]=F[i-]*P%mod; while(scanf("%s",&s)!=EOF){
tr.init();
len=strlen(s);
for(int i=;i<len;i++)
tr.add(s[i]); h[]=s[];
for(int i=;i<len;i++)
h[i]=(h[i-]*P%mod+s[i])%mod;
tr.count(); for(int i=;i<len;i++)
cout<<tr.ans[i]<<" ";
cout<<tr.ans[len]<<'\n';
}
}

字符串hash+回文树——hdu6599的更多相关文章

  1. BZOJ5384 有趣的字符串题 回文树

    神奇的结论: 一个字符串的所有回文后缀的长度,可以形成$k$个等差数列,$k$是$log$级的 考虑前$R$个字符组成的字符串,对于一个等差数列,假设组成这个等差数列的回文串,最短的叫$a$,最长的叫 ...

  2. UVALive-7041(回文树

    题意:给你两个字符串,问你有多少对公共回文串. 思路:先对a字符串建回文树.然后再把b字符串加进去就好了. #include<cstdio> #include<cmath> # ...

  3. ACM-ICPC 2018 南京赛区网络预赛 I Skr (马拉车+hash去重)或(回文树)

    https://nanti.jisuanke.com/t/30998 题意 给一串由0..9组成的数字字符串,求所有不同回文串的权值和.比如说“1121”这个串中有“1”,“2”,“11”,“121” ...

  4. HDU 6599 I Love Palindrome String (回文树+hash)

    题意 找如下子串的个数: (l,r)是回文串,并且(l,(l+r)/2)也是回文串 思路 本来写了个回文树+dfs+hash,由于用了map所以T了 后来发现既然该子串和该子串的前半部分都是回文串,所 ...

  5. 回文树(回文自动机PAM)小结

    回文树学习博客:lwfcgz    poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~ ...

  6. 杭电多校HDU 6599 I Love Palindrome String (回文树)题解

    题意: 定义一个串为\(super\)回文串为: \(\bullet\) 串s为主串str的一个子串,即\(s = str_lstr_{l + 1} \cdots str_r\) \(\bullet\ ...

  7. 2014-2015 ACM-ICPC, Asia Xian Regional Contest G The Problem to Slow Down You 回文树

    The Problem to Slow Down You Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjud ...

  8. [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串

    回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...

  9. UESTC - 1999 也许这是唯一能阻止乐爷AK的方法( Just for Fun )(回文树)

    https://vjudge.net/problem/UESTC-1999 题意 对于一个初始为空的字符串S,你可以进行以下两种操作: 1. 在S的末尾加一个小写字母. 2. 移除S的最后一个字母. ...

随机推荐

  1. linux中python3的安装

    yum -y install openssl-devel #要使用pip3需要安装这个软件tar xf Python-3.5.6.tgz cd Python-3.5.6 ./configure --p ...

  2. Vue学习笔记【26】——Vue路由(什么是路由)

    什么是路由 后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源,这个对应关系就是后端中的路由: 前端路由:对于单页面应用程序来说,主要通过URL中的hash ...

  3. python3 schedule定时任务

    import time import schedule # cd C:\Python36-32\Scripts pip install schedule # py文件名字不能叫schedule,否则会 ...

  4. 用记事本和Eclipse编写Java程序

    JRE(Java Runtime Environment    Java运行环境) 包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一 ...

  5. 「FJOI2018」领导集团问题 解题报告

    「FJOI2018」领导集团问题 题意:给你一颗\(n\)个点的带点权有根树,选择一个点集\(S\),使得点集中所有祖先的点权$\le \(子孙的点权,最大化\)|S|$(出题人语死早...) 一个显 ...

  6. 搜索引擎优化 TF_IDF之Java实现

    实现之前,我们要事先说明一些问题: 我们用Redis对数据进行持久化,存两种形式的MAP: key值为term,value值为含有该term的urlkey值为url,value值为map,记录term ...

  7. 2018——2019 20165239Exp9 Web安全基础

    Exp9 Web安全基础 一:基础问题回答 (1)SQL注入攻击原理,如何防御 •原理:它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意SQL语 ...

  8. Code::Blocks

    Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境. Code::Blocks是开放源码软件.Code::Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库w ...

  9. MAC OpenGL 环境搭建

    MAC OpenGL 环境搭建 基础库介绍 先要安装两个库一个是GLEW(OpenGL Extension Wrangler Library),另外一个是GLFW(Graphics Library F ...

  10. 访问者模式和 ASM

    文章目录 一. 概述 & 定义 二. 示例 2.1 创建抽象元素 2.2 创建具体元素 2.3 创建抽象访问者 2.4 创建具体访问者 2.5 访问者代码调用 三. ASM 中的访问者模式 3 ...