其实每个串都不是回文串也能做的说。。。

题意:给定 \(n\) 个互不相同的串,两两拼接一共能够拼出 \(n^2\) 个串,问这 \(n^2\) 个串中有几个回文串。

首先假设拼接出来的串是 \(AB\),且 \(A\) 的长度大于 \(B\) 的长度。

\(AB\) 是回文串,那么回文中心一定在 \(A\) 上,那么就说明 \(B\) 的反串一定是 \(A\) 的前缀。将 \(A\) 去掉这个前缀后,剩下的后缀一定也是回文串。

然后问题就变成了了询问有多少个串是一个串的前缀,以及一个串的后缀是否是回文串。前者用 Trie,后者用 Hash 就好了。

每个串都是回文串只是方便了处理而已,处理后缀是否为回文串相当于处理前缀是否为回文串。

不懂为什么是紫题。。。

#include<algorithm>
#include<cstdio>
typedef unsigned ui;
const ui M=2e6+5,mod=998244353;
ui n,m,mx,tot(1),p[M],len[M],cnt[M],chi[M][26];char s[M],*S[M];bool Vis[M],*vis[M];long long ans;
inline void Insert(char*s,const ui&len){
ui i,now(1);
for(i=0;i^len;++i)!chi[now][s[i]-97]&&(chi[now][s[i]-97]=++tot),now=chi[now][s[i]-97];++cnt[now];
}
inline void Match(char*s,const ui&id,const ui&len){
ui i,now(1);
for(i=0;i^len;++i)cnt[now]&&vis[id][len-i-1]&&(ans+=cnt[now]),now=chi[now][s[i]-97];
}
signed main(){
ui i,j,h1,h2;scanf("%u",&m);S[1]=s;vis[1]=Vis;p[0]=1;
for(i=1;i<=m;++i)scanf("%u%s",len+i,S[i]),S[i+1]=S[i]+len[i],Insert(S[i],len[i]),len[i]>mx&&(mx=len[i]);
for(i=1;i^mx;++i)p[i]=13331ull*p[i-1]%mod;
for(j=1;j<=m;++j){
vis[j+1]=vis[j]+len[j];h1=h2=0;
for(i=0;i^len[j];++i)h1=(1ull*p[1]*h1+(S[j][i]-97))%mod,h2=(h2+1ull*p[i]*(S[j][i]-97))%mod,vis[j][i]=h1==h2;
}
for(i=1;i<=m;++i)Match(S[i],i,len[i]);printf("%lld",(ans<<1)+m);
}

LGP3449题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. python unittest控制用例的执行顺序

    为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的 ...

  2. 浅谈php web安全

    首先,笔记不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记.细心总结文章,里面有些是我们phper不易发现或者说不重视的东西.所以笔者写下来方便以后查阅.在大公司肯定有专门的we ...

  3. Net6 DI源码分析Part4 CallSiteFactory ServiceCallSite

    Net6 CallSiteFactory ServiceCallSite, CallSiteChain abstract class ServiceCallSite ServiceCallSite是个 ...

  4. Pollard's rho algorithm和涉及到的两个循环检测算法

    0. 简单介绍 Pollard的\(\rho\)算法是John Pollard在1975年发明的,用于分解质因数[1].假定被分解的数为N,N的最小的质因数为\(p(p\ne N)\),那么该算法可以 ...

  5. 用Java模拟实现对系统文件以目录的拷贝功能

    要用Java对单个文件拷贝的话,其实思路很简单,循环读取被拷贝文件,放入byte数组,然后写入目标文件.当然我们也可以借助现有的类去完成,如InputStream中的transferTo()方法就可以 ...

  6. 从 MMU 看内存管理

    在计算机早期的时候,计算机是无法将大于内存大小的应用装入内存的,因为计算机读写应用数据是直接通过总线来对内存进行直接操作的,对于写操作来说,计算机会直接将地址写入内存:对于读操作来说,计算机会直接读取 ...

  7. 通过shell脚本进行linux服务器的CPU和内存压测

    文章目录 内存压测 python的方式 shell的方式 cpu压测 在正常手段下,这个只是压测的方法 在不正常手段下(crontab计划任务),可以提高CPU和内存的使用率 什么?你问我为什么要提高 ...

  8. mysql is not null 执行效率低

    a表字段类型为int b表字段类型为varchar a left join b时如果查询条件是is not null,效率很快,is  null 效率很低 后来两者改为同类型 int,效率很高

  9. PON/产线测试解决方案

    第一章 方案背景与概述1.1 方案背景随着网络的高速发展与网络速率的不断提升,用户对网络产品的可靠性要求也越来 越高.网络产品的故障符合"浴盆曲线"规律,生产过程中的严格测试能够及 ...

  10. Smartbi:利用好excel分析工具,数据分析都是小case!

    数据分析听起来好像很高端的样子,但是实际上在一些IT高手的眼里,只需要掌握以下几个excel数据分析小工具的使用,你也能够成为别人眼中的数据大神! 1.excel数据分析工具--条件格式 快速找出符合 ...