博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gym - 100548G The Problem to Slow Down You
阅读量:5057 次
发布时间:2019-06-12

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

 

 

    依然是回文树。

    我们只需要吧siz[]改成统计两边的siz[][0/1],然后把两个字符中间随便加一个不会出现的字符拼起来,做一遍回文树统计一下就OJBK了

 

#include
#define ll unsigned long longusing namespace std;const int maxn=500005;int T,n,len[maxn],sum[maxn][2],zt,m,p;int ch[maxn][27],fl[maxn],cnt,now,c;char s[maxn];ll ans;inline void init(){ ans=zt=0,fill(s,s+n+1,0); for(int i=0;i<=cnt;i++) memset(ch[i],0,sizeof(ch[i])); for(int i=0;i<=cnt;i++) sum[i][0]=sum[i][1]=0; fill(len,len+cnt+1,0); fill(fl,fl+cnt+1,0);}inline void solve(){ fl[0]=1,len[1]=-1,cnt=now=1; for(int i=1;i<=n;i++,now=ch[now][c],sum[now][zt]++){ if(i>m) zt=1; c=s[i]-'a'; for(;s[i-len[now]-1]!=s[i];now=fl[now]); if(!ch[now][c]){ ch[now][c]=++cnt; len[cnt]=len[now]+2; if(len[cnt]==1) continue; p=fl[now]; for(;s[i-len[p]-1]!=s[i];p=fl[p]); fl[cnt]=ch[p][c]; } } for(int i=cnt;i>=2;i--){ sum[fl[i]][0]+=sum[i][0]; sum[fl[i]][1]+=sum[i][1]; ans+=sum[i][0]*(ll)sum[i][1]; }}int main(){ scanf("%d",&T); for(int o=1;o<=T;o++){ init(); scanf("%s",s+1),s[0]='?',m=strlen(s+1); s[m+1]='z'+1,scanf("%s",s+m+2),n=strlen(s+1); solve(),printf("Case #%d: %I64u\n",o,ans); } return 0;}

  

转载于:https://www.cnblogs.com/JYYHH/p/9214003.html

你可能感兴趣的文章
一个关于vue+mysql+express的全栈项目(六)------ 聊天模型的设计
查看>>
【知识库】-数据库_MySQL 的七种 join
查看>>
.net 写文件上传下载webservice
查看>>
noSQL数据库相关软件介绍(大数据存储时候,必须使用)
查看>>
iOS开发——缩放图片
查看>>
HTTP之URL的快捷方式
查看>>
满世界都是图论
查看>>
配置链路聚合中极小错误——失之毫厘谬以千里
查看>>
代码整洁
查看>>
蓝桥杯-分小组-java
查看>>
Java基础--面向对象编程1(类与对象)
查看>>
Android Toast
查看>>
iOS开发UI篇—Quartz2D使用(绘制基本图形)
查看>>
docker固定IP地址重启不变
查看>>
桌面图标修复||桌面图标不正常
查看>>
JavaScript基础(四)关于对象及JSON
查看>>
关于js sort排序方法
查看>>
JAVA面试常见问题之Redis篇
查看>>
javascript:二叉搜索树 实现
查看>>
网络爬虫Heritrix源码分析(一) 包介绍
查看>>