依然是回文树。

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

#include<bits/stdc++.h>
#define ll unsigned long long
using 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;
}

  

最新文章

  1. 【开源】玩的就是开源 - DevFw
  2. 用LinkedList模拟栈数据结构的集合
  3. ThinkPHP讲解(八)——显示、修改、添加、删除
  4. FreeSWITCH的传真发送
  5. python有序查找算法:二分法
  6. Redis简介及3.0.2编译安装
  7. LR(0)语法分析
  8. WebApi个人理解概要
  9. 怎么改变title属性的样式?
  10. gorm的日志模块源码解析
  11. 前端入门11-JavaScript语法之数组
  12. 【php增删改查实例】第二十二节 - 引入百度地图
  13. VS增加插件 Supercharger破解教程
  14. [No0000185]Java技术板块图
  15. webpack.DefinePlugin
  16. python初探 socket
  17. C# WINFORM的自动更新程序
  18. mac下将根目录/更改组到普通用户,导致sudo不能用
  19. 剑指offer63:数据流中的中位数
  20. ubuntu 12.04 LTS server 中文乱码【转】

热门文章

  1. ORB feature(O for orientation)
  2. java多线程系列五、并发容器
  3. oracle删除表字段和oracle表增加字段
  4. tomcat apr
  5. 一步步实现windows版ijkplayer系列文章之七——终结篇(附源码)
  6. zabbix系列(三)zabbix3.0.4微信告警配置详解
  7. css系列之box-sizing
  8. jade(pug)学习和使用
  9. windows下sublime通过sftp扩展上传文件到linux服务器上
  10. Webpack中的css-loader 和style-loader