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 ...
随机推荐
- 基于白名单的Payload
利用 Msiexec 命令DLL反弹 Msiexec是Windows Installer的一部分.用于安装Windows Installer安装包(MSI),一般在运行Microsoft Update ...
- javascript 仿jQuery的无new构造函数
/* 匿名函数 传入 window 值全局变量成为局部变量 */ (function(window,undefined) { /* 申明一个名为jQuery 的函数*/ function jQuery ...
- 怎样在微信H5中点击直接跳转到公众号
第一步: 打开微信公众号, 随便找一篇公众号文章, 将它发送给你的某个好友. 第二步: 使用默认浏览器打开这个分享的文章链接, 然后复制链接里面的biz字段到下面这个URL中替换 第三步: 在html ...
- vc 网络编程(socket)
在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例.希望对您有所帮助 一.原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:htt ...
- StoneTab标签页CAD插件 3.1.0
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- c#OpenCVSharp+Zxing识别条形码
参考博客:https://www.cnblogs.com/dengxiaojun/p/5278679.html,但是他的demo下载太贵了 可以下载这个https://download.csdn.ne ...
- luogu2261余数求和题解--整除分块
题目链接 https://www.luogu.org/problemnew/show/P2261 分析 显然\(k\) \(mod\) \(i=k-\lfloor {k/i}\rfloor\) \(\ ...
- 基于【 springBoot +springCloud+vue 项目】三 || 项目部署
前言 今天所要讲的项目部署,并非正式环境部署,而是作为开发中的测试环境部署.随着项目模块的增多,启动的模块也随之增多,本人的电脑启动四个模块就已经卡的不行了,为了减轻电脑压力,不得不自己学着搭建一个项 ...
- WinPE基础知识之头部
1.DOS头 // DOS MZ头,大小为64个字节 typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // EXE标志,“MZ”(有用,解析时作为是否 ...
- 4.SpringMVC 配置式开发-处理器映射器
处理器映射器 HandlerMapping HandlerMapping 接口负责根据request请求找到对应的Handler处理器及Interceptor拦截器, 并将它们封装在HandlerEx ...