POJ - 3376 Finding Palindromes manacher+字典树
题意
给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+字典树的更多相关文章
- POJ 3376 Finding Palindromes EX-KMP+字典树
题意: 给你n个串串,每个串串可以选择和n个字符串拼接(可以自己和自己拼接),问有多少个拼接后的字符串是回文. 所有的串串长度不超过2e6: 题解: 这题由于是在POJ上,所以string也用不了,会 ...
- POJ 3376 Finding Palindromes (tire树+扩展kmp)
很不错的一个题(注意string会超时) 题意:给你n串字符串,问你两两匹配形成n*n串字符串中有多少个回文串 题解:我们首先需要想到多串字符串存储需要trie树(关键),然后我们正序插入倒序匹配就可 ...
- poj 3376 Finding Palindromes
Finding Palindromes http://poj.org/problem?id=3376 Time Limit: 10000MS Memory Limit: 262144K ...
- POJ - 3376 Finding Palindromes(拓展kmp+trie)
传送门:POJ - 3376 题意:给你n个字符串,两两结合,问有多少个是回文的: 题解:这个题真的恶心,我直接经历了5种错误类型 : ) ... 因为卡内存,所以又把字典树改成了指针版本的. 字符串 ...
- POJ 3376 Finding Palindromes(manacher求前后缀回文串+trie)
题目链接:http://poj.org/problem?id=3376 题目大意:给你n个字符串,这n个字符串可以两两组合形成n*n个字符串,求这些字符串中有几个是回文串. 解题思路:思路参考了这里: ...
- B - Finding Palindromes (字典树+manacher)
题目链接:https://cn.vjudge.net/contest/283743#problem/B 题目大意:给你n个字符串,然后问你将这位n个字符串任意两两组合,然后问你这所有的n*n种情况中, ...
- POJ 3376 Finding Palindromes(扩展kmp+trie)
题目链接:http://poj.org/problem?id=3376 题意:给你n个字符串m1.m2.m3...mn 求S = mimj(1=<i,j<=n)是回文串的数量 思路:我们考 ...
- poj 3764 The xor-longest Path(字典树)
题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
随机推荐
- linux的定时器(timer_create,timer_gettime,timer_delete,SIGEV_SIGNAL)
ref : http://blog.chinaunix.net/uid-28458801-id-5035347.html 系统中的一个模块需要频繁的获取系统时间,使用linux中内置的函数开销过大 ...
- Linux下mysql创建用户并设置权限,设置远程连接
为了安全考虑,OneinStack仅允许云主机本机(localhost)连接数据库,如果需要远程连接数据库,需要如下操作:打开iptables 3306端口 # iptables -I INPUT 4 ...
- upxmake --- upx source compilation
upxmake --- upx source compilation 1. 下载upx所依赖的组件源码 zlib-1.2 http://www.zlib.net/zlib-1.2.11.tar.gz ...
- 文件的空间使用和IO统计
数据库占用的存储空间,从高层次来看,可以查看数据库文件(数据文件,日志文件)占用的存储空间,从较细的粒度上来看,分为数据表,索引,分区占用的存储空间.监控数据库对象占用的硬盘空间,包括已分配,未分配, ...
- appium-清空输入框的内容后,再次输入内容会回退最后两个字符串
问题描述 有两个输入框,用户名和密码输入框 调用set_text方法,输入用户名 再次调用set_text方法,输入密码 清空用户名输入框的内容后,再次输入内容会回退最后两个字符串 出问题的代码 de ...
- Vue介绍:vue导读2
一.实例中的成员 二.高级指令 三.组件初识 一.实例中的成员 # 计算computed <!DOCTYPE html> <html> <head> <met ...
- web开发:jquery高级
一.jq选择器 二.属性操作 三.jq轮播图 四.样式操作 五.jq动事件 六.jq动画 七.自定义动画 八.jq动画案例 一.jq选择器 - css3语法选择器 ```js$('css3选择器位') ...
- Kinect 深度测量原理
和其他摄像机一样,近红外摄像机也有视场.Kinect摄像机的视野是有限的,如下图所示: 如图,红外摄像机的视场是金字塔形状的.离摄像机远的物体比近的物体拥有更大的视场横截面积.这意味着影像的高度和宽度 ...
- mongo批量写入es
import pymongo import math from elasticsearch import Elasticsearch from elasticsearch import helpers ...
- 说说lock到底锁谁(II)?
摘要 今天在园子里面有园友反馈关于[C#基础]说说lock到底锁谁?文章中lock(this)的问题.后来针对文章中的例子,仔细想了一下,确实不准确,才有了这篇文章的补充,已经对文章中的demo进行修 ...