博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
回文自动机(BZOJ2565)
阅读量:5980 次
发布时间:2019-06-20

本文共 3397 字,大约阅读时间需要 11 分钟。

#include 
#include
#include
using namespace std; int p,next[100001][27],cnt[100001],len[100001],fail[100001],last,a[100001],maxl[100001],maxr[100001]; char st[100001]; int newnode(int l){ p++; for (int i=1;i<=26;i++) next[p][i]=0; cnt[p]=0; len[p]=l; return(p); } void init(){ p=-1; newnode(0); newnode(-1); last=1; st[0]=-1; fail[0]=1; } int get_fail(int po,int x,int num){ while (a[po-len[x]-1]!=num) x=fail[x]; return(x); } void add(int po,int c){ int cur=get_fail(po,last,c); if (!next[cur][c]){ int now=newnode(len[cur]+2); fail[now]=next[get_fail(po,fail[cur],c)][c]; next[cur][c]=now; } last=next[cur][c]; cnt[last]++; } void count(){ for (int i=p;i>=0;i--) cnt[fail[i]]+=cnt[i]; } int main(){ scanf("%s",&st); int n=strlen(st); for (int i=1;i<=n;i++) a[i]=st[i-1]-'a'+1; init(); for (int i=1;i<=n;i++) add(i,a[i]),maxl[i]=len[last]; count(); for (int i=1;i<=n/2;i++){ int t=a[i];a[i]=a[n-i+1];a[n-i+1]=t; } init(); for (int i=1;i<=n;i++) add(i,a[i]),maxr[n-i+1]=len[last]; count(); int ans=0; for (int i=1;i

每个节点表示一个本质不同的回文串(最多n个)。

进行count()后,cnt中存每个本质不同的回文串的出现次数。

------------------------------------------------------------------------

CODECHEF APRIL LUNCHTIME 2015 PALPROB

在fail树上转移palindromness

#include 
#include
#include
#include
#define LL long longusing namespace std; map
mp,mpb; int p,tr[110001][27],cnt[110001],len[110001],fail[110001],last,a[110001],maxl[110001],maxr[110001]; int ans[110001],nd[110001],nxt[110001],des[110001],T,scnt; char st[110001]; void addedge(int x,int y){ nxt[++scnt]=nd[x];des[scnt]=y;nd[x]=scnt; } int newnode(int l){ p++; for (int i=1;i<=26;i++) tr[p][i]=0; cnt[p]=0;ans[p]=0; len[p]=l; return(p); } void init(){ p=-1; newnode(0);newnode(-1); last=1; st[0]=-1; fail[0]=1; } int get_fail(int po,int x,int num){ while (a[po-len[x]-1]!=num) x=fail[x]; return(x); } void add(int po,int c){ int cur=get_fail(po,last,c); if (tr[cur][c]==0){ int now=newnode(len[cur]+2); fail[now]=tr[get_fail(po,fail[cur],c)][c]; tr[cur][c]=now; } last=tr[cur][c]; cnt[last]++; } void count(){ for (int i=p;i>=0;i--) cnt[fail[i]]+=cnt[i]; } void dfs(int po){ if (len[po]>=0){ int t; if (len[po]<=1) t=-1;else t=len[po]/2; int p=mp[t]; if (mpb[t]) ans[po]=ans[p]+1;else ans[po]=1; } mpb[len[po]]=1;mp[len[po]]=po; for (int p=nd[po];p!=-1;p=nxt[p]) dfs(des[p]); mpb[len[po]]=0; } int main(){ freopen("a.in","r",stdin); scanf("%d",&T); while (T--){ scanf("%s",&st); int n=strlen(st); for (int i=1;i<=n;i++) a[i]=st[i-1]-'a'+1; init(); for (int i=1;i<=n;i++) add(i,a[i]); count(); for (int i=0;i<=p;i++) nd[i]=-1;scnt=0; for (int i=0;i<=p;i++) if (i!=1) addedge(fail[i],i); mp.clear();mpb.clear(); dfs(1); LL ret=0; for (int i=2;i<=p;i++) ret+=(LL)ans[i]*cnt[i]; printf("%lld\n",ret); } }

 

转载于:https://www.cnblogs.com/zhujiangning/p/6032530.html

你可能感兴趣的文章
MySQL备份之分库分表备份脚本
查看>>
Java 与 Netty 实现高性能高并发
查看>>
SurfControl人工智能新突破 领跑反垃圾邮件
查看>>
一个动态ACL的案例
查看>>
openstack 之 windows server 2008镜像制作
查看>>
VI快捷键攻略
查看>>
Win server 2012 R2 文件服务器--(三)配额限制
查看>>
卓越质量管理成就创新高地 中关村软件园再出发
查看>>
linux rsync 远程同步
查看>>
httpd的manual列目录漏洞
查看>>
myeclipse2014破解过程
查看>>
漫谈几种反编译对抗技术
查看>>
Timer 和 TimerTask 例子
查看>>
Spring BOOT 集成 RabbitMq 实战操作(一)
查看>>
安装python3.5注意事项及相关命令
查看>>
进程通信之无名信号量
查看>>
并发串行调用接口
查看>>
FileStream大文件复制
查看>>
Hibernate学习之SessionFactory的opensession 和 getCu...
查看>>
web网站服务(二)
查看>>