题意

给n个字符串,两两拼接,问拼接后的\(n\times n\)个字符串中有多少个回文串。

分析

将所有正串插入字典树中,马拉车跑出所有串哪些前缀和后缀为回文串,记录位置,用反串去字典树中查询,两字符串拼成回文串有三种情况:

  • 未匹配完,反串后缀是回文串。

  • 匹配结束,正串后缀是回文串。

  • 匹配结束,正串等于反串。

字典树中维护当前位置有多少正串和当前位置有多少后缀为回文串的正串。

Code

#include<cstring>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
#include<map>
#define fi first
#define se second
#define pb push_back
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=2e6+10;
int p[maxn*2],f[2][maxn],len[maxn],sum[2][maxn];
char s[maxn],t[maxn*2];
int son[maxn][26],tot;
ll ans;
void ins(int dl,int dr){
int rt=0;
for(int i=dl;i<=dr;i++){
if(f[1][i]) sum[1][rt]++;
if(!son[rt][s[i]-'a']) son[rt][s[i]-'a']=++tot;
rt=son[rt][s[i]-'a'];
if(i==dr) sum[0][rt]++;
}
}
void qy(int dl,int dr){
int rt=0;
for(int i=dr;i>=dl;i--){
if(f[0][i]) ans+=sum[0][rt];
if(!son[rt][s[i]-'a']) return;
rt=son[rt][s[i]-'a'];
if(i==dl) ans+=sum[1][rt]+sum[0][rt];
}
}
int mlc(int dl,int dr){
int m=0,p0=1;p[1]=1;t[++m]='#';
for(int i=dl;i<=dr;i++){
t[++m]=s[i];
t[++m]='#';
}
for(int i=2;i<=m;i++){
int j=min(p[p0]+p0-i,p[2*p0-i]);
if(i+j<p[p0]+p0){
p[i]=j;
}else{
while(i-j>=1&&i+j<=m&&t[i-j]==t[i+j]) ++j;
p[i]=j;p0=i;
}
}
for(int i=dl;i<dr;i++){
if(p[i-dl+2]-1==i-dl+1) f[0][i]=1;
if(p[dr-2*dl+i+3]-1==dr-i) f[1][i+1]=1;
}
}
int main(){
//ios::sync_with_stdio(false);
//freopen("in","r",stdin);
int n;
scanf("%d",&n);int l=1;
for(int i=1,m;i<=n;i++){
scanf("%d%s",&len[i],s+l);
mlc(l,l+len[i]-1);
ins(l,l+len[i]-1);
l+=len[i];
}l=1;
for(int i=1;i<=n;i++){
qy(l,l+len[i]-1);
l+=len[i];
}
cout<<ans<<'\n';
return 0;
}

POJ - 3376 Finding Palindromes manacher+字典树的更多相关文章

  1. POJ 3376 Finding Palindromes EX-KMP+字典树

    题意: 给你n个串串,每个串串可以选择和n个字符串拼接(可以自己和自己拼接),问有多少个拼接后的字符串是回文. 所有的串串长度不超过2e6: 题解: 这题由于是在POJ上,所以string也用不了,会 ...

  2. POJ 3376 Finding Palindromes (tire树+扩展kmp)

    很不错的一个题(注意string会超时) 题意:给你n串字符串,问你两两匹配形成n*n串字符串中有多少个回文串 题解:我们首先需要想到多串字符串存储需要trie树(关键),然后我们正序插入倒序匹配就可 ...

  3. poj 3376 Finding Palindromes

    Finding Palindromes http://poj.org/problem?id=3376 Time Limit: 10000MS   Memory Limit: 262144K       ...

  4. POJ - 3376 Finding Palindromes(拓展kmp+trie)

    传送门:POJ - 3376 题意:给你n个字符串,两两结合,问有多少个是回文的: 题解:这个题真的恶心,我直接经历了5种错误类型 : ) ... 因为卡内存,所以又把字典树改成了指针版本的. 字符串 ...

  5. POJ 3376 Finding Palindromes(manacher求前后缀回文串+trie)

    题目链接:http://poj.org/problem?id=3376 题目大意:给你n个字符串,这n个字符串可以两两组合形成n*n个字符串,求这些字符串中有几个是回文串. 解题思路:思路参考了这里: ...

  6. B - Finding Palindromes (字典树+manacher)

    题目链接:https://cn.vjudge.net/contest/283743#problem/B 题目大意:给你n个字符串,然后问你将这位n个字符串任意两两组合,然后问你这所有的n*n种情况中, ...

  7. POJ 3376 Finding Palindromes(扩展kmp+trie)

    题目链接:http://poj.org/problem?id=3376 题意:给你n个字符串m1.m2.m3...mn 求S = mimj(1=<i,j<=n)是回文串的数量 思路:我们考 ...

  8. poj 3764 The xor-longest Path(字典树)

    题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...

  9. poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12731   Accepted: 544 ...

随机推荐

  1. 20190805-Python基础 第二章 列表和元组(2)列表

    1. list函数,用于将字符串转换为列表 2. 基本的列表操作 修改列表 - 给元素赋值,使用索引表示法给特定的元素赋值,如x[1] = 2 删除元素 - 使用del语句即可 name1 = ['a ...

  2. 用python打开文件夹的三种方式

    一.利用explorer.exe import os # 利用explorer.exe执行 start_directory = r'C:\代码\软件包' os.system("explore ...

  3. Spring MVC 探讨DispatcherServlet

    先上DispatcherServlet的运行流程图(request processing):

  4. 微信公众号支付备忘及填坑之路-java

    一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...

  5. ELinq学习一

    ELinq安装:在Nuget控制台中输入:install-package ELinq一.ELinq与DLinq和EF的功能差异 二.数据库对照表 三.CRUD操作1.插入(Insert)(1)简单形式 ...

  6. 编写Dockerfile自定义镜像

    要求 编写一个Dockerfile自定义centos镜像,要求在容器内部可以使用vim和ifconfig命令,并且登入落脚点为/usr/local 编写Dockerfile FROM centos M ...

  7. Java后端开发常用工具

    Java后端开发常用工具推荐: 俗话说,工欲善其事,必先利其器.不过初学时候不大建议过度依赖IDE等过多工具,这会让自己的编程基础功变得很差,比如各种语法的不熟悉,各种关键字比如synchronize ...

  8. list 字符串拼接效率实验

    ist 字符串拼接有多种方法,我就其中常用三种做了实验,实验代码如下: 第一次是为了初始化静态方法,后面的才是效率比较. 结果如下: StringUtils join 方法用的是StringBuild ...

  9. android项目笔记整理(3)

    61.AlphabetIndexer字母索引辅助类       实现对链表类型的数据进行快速索引. 应用于类似联系人列表右侧的导航栏 注意:       1.链表里的元素必须是Object类型,并实现 ...

  10. Collection 和 Collections的区别

    1.java.util.Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体的实现.Coll ...