拖了很久才补的回文树,感觉网上的博客都是一个做法。。回文树统计不同种类的回文串出现次数,然后用字符串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';
}
}

最新文章

  1. ios 关于问题 no matching provisioning profiles found
  2. 20 个高质量响应式的 HTML/CSS 网站模板
  3. LuaLaTeX \documemtclass{standalone} 编译错误
  4. js中val()和value的区别
  5. fast db 学习
  6. CSS3实现二十多种基本图形
  7. 玩转Android之手摸手教你DIY一个抢红包神器!
  8. What is the innovator&rsquo;s solution&mdash;&mdash;什么才是创新的解决方案1
  9. JQ 动态添加节点
  10. JavaScript之&lt;script&gt;标签简介
  11. IT第十八天 - 类的封装、继承、重载、上周总结★★★
  12. libguestfs-tools 虚拟机磁盘管理工具
  13. 转:Java中finally和return的执行关系
  14. docker注意事项
  15. ubuntu 英文系统下安装中文输入法
  16. 【原创】运维基础之Redis(1)简介、安装、使用
  17. IOS 圆形进度条
  18. 人生苦短之HTTP协议及Requests库的方法
  19. Solr[Q] -No live SolrServers available to handle this request, no servers hosting shard
  20. C++编程模板2

热门文章

  1. VS2017编译64位CloudCompare
  2. 高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理
  3. js滚动到顶部底部代码
  4. Go语言TCP Socket编程
  5. Python的从头再来
  6. 用 Flask 来写个轻博客 (2) — Hello World!
  7. HDU 6659 Acesrc and Good Numbers (数学 思维)
  8. 用EditText控件的属性inputType
  9. 一分钟开启Tomcat https支持
  10. spring boot Swagger2(version=2.7.0) 注解@ApiImplicitParam的属性dataType值为”自定义泛型“应用