【题解】APIO2014回文串
哇哦~想不到我有生之年竟然能够做出字符串的题目ヾ(✿゚▽゚)ノ虽然这题比较裸但依然灰常开心!
首先有一个棒棒的性质:本质不同的回文串最多有 O(n) 个。首先 manacher 把它们都找出来,然后问题就变成了给定 n 个子串,求它们在原串中出现的次数。求出 height 然后二分一下即可(这个好像是SA 的基础操作?)。
#include <bits/stdc++.h>
using namespace std;
#define maxn 601550
#define CNST 22
int n, N, m, p1[maxn], p2[maxn], rk[maxn], bits[CNST];
int p[maxn], rec[maxn], t[maxn], y[maxn], Log[maxn];
int num[maxn], SA[maxn], ST[maxn][CNST];
long long ans;
char a[maxn], s[maxn]; void pre()
{
s[] = s[] = '#'; s[ * n + ] = '?';
for(int i = ; i < n; i ++) s[i * + ] = a[i], s[i * + ] = '#';
N = n * + ;
} void Up(int &x, int y) { x = (x > y) ? x : y; }
void manacher()
{
int mid = , mr = ;
for(int i = ; i < N; i ++)
{
if(i <= mr) p[i] = min(p[(mid << ) - i], p[mid] + mid - i);
else p[i] = ; Up(rec[i + p[i] - ], p[i]);
while(s[i + p[i]] == s[i - p[i]])
{
p[i] ++;
Up(rec[i + p[i] - ], p[i]);
}
if(p[i] + i - > mr) mr = p[i] + i - , mid = i;
}
} //SA
void Rsort(int *p, int *x, int *id)
{
for(int i = ; i <= m; i ++) t[i] = ;
for(int i = ; i <= n; i ++) t[p[i]] ++;
for(int i = ; i <= m; i ++) t[i] += t[i - ];
for(int i = n; i >= ; i --) x[t[p[id[i]]] --] = id[i];
} bool cmp(int x, int y) { return y && (p1[x] == p1[y] && p2[x] == p2[y]); }
void Get_SA()
{
m = ;
for(int k = ; bits[k] <= n; k ++)
{
for(int i = ; i <= n; i ++)
p1[i] = rk[i], p2[i] = (i + bits[k] <= n) ? rk[i + bits[k]] : ;
Rsort(p2, y, num); Rsort(p1, SA, y);
for(int i = , p = ; i <= n; m = p, i ++)
rk[SA[i]] = cmp(SA[i - ], SA[i]) ? p : ++ p;
if(m >= n) break;
}
} void Get_Height()
{
for(int i = , k = ; i <= n; i ++)
{
if(k) k --;
int j = SA[rk[i] - ];
while(max(i, j) + k - <= n && a[j + k - ] == a[i + k - ]) k ++;
ST[rk[i]][] = k;
}
} void Build()
{
for(int j = ; j < CNST; j ++)
for(int i = ; i + bits[j] - <= n; i ++)
ST[i][j] = min(ST[i][j - ], ST[i + bits[j - ]][j - ]);
} int RMQ(int x, int y)
{
if(y < x) swap(x, y);
int k = Log[y - x + ];
return min(ST[x][k], ST[y - bits[k] + ][k]);
} int Query(int x, int len)
{
int l = , r = rk[x], ans2 = rk[x], ans1 = rk[x] + ;
while(l <= r)
{
int mid = (l + r) >> ;
if(RMQ(rk[x], mid) >= len) ans1 = mid, r = mid - ;
else l = mid + ;
} ans1 --; l = rk[x] + , r = n;
while(l <= r)
{
int mid = (l + r) >> ;
if(RMQ(rk[x] + , mid) >= len) ans2 = mid, l = mid + ;
else r = mid - ;
}
return ans2 - ans1 + ;
} void init()
{
Log[] = -; for(int i = ; i < maxn; i ++) Log[i] = Log[i >> ] + ;
bits[] = ; for(int i = ; i < CNST; i ++) bits[i] = bits[i - ] << ;
for(int i = ; i < maxn; i ++) num[i] = i;
} int main()
{
init();
scanf("%s", a); n = strlen(a);
pre(); manacher();
for(int i = ; i <= n; i ++) rk[i] = a[i - ];
Get_SA(); Get_Height(); Build();
for(int i = ; i < N; i ++)
{
if(s[i] == '#') continue;
int r = (i - ) >> ;
int l = r - rec[i] + ; r ++, l ++;
int t = Query(l, r - l + );
ans = max(ans, 1ll * t * (r - l + ));
}
printf("%lld\n", ans);
return ;
}
【题解】APIO2014回文串的更多相关文章
- HDU5421 Victor and String 和 APIO2014 回文串
两道差不多的题,都是回文自动机right集合处理相关. Victor and String Victor loves to play with string. He thinks a string i ...
- BZOJ 3676: [Apio2014]回文串
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2013 Solved: 863[Submit][Status ...
- bzoj 3676: [Apio2014]回文串 回文自动机
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 844 Solved: 331[Submit][Status] ...
- [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串
回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...
- 【BZOJ 3676】 3676: [Apio2014]回文串 (SAM+Manacher+倍增)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2343 Solved: 1031 Description 考 ...
- [BZOJ3676][APIO2014]回文串(Manacher+SAM)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 3097 Solved: 1408[Submit][Statu ...
- 3676: [Apio2014]回文串
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1740 Solved: 744 [Submit][Status ...
- [Bzoj3676][Apio2014]回文串(后缀自动机)(parent树)(倍增)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 3396 Solved: 1568[Submit][Statu ...
- 【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习
写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文 ...
- bzoj3676 [Apio2014]回文串 卡常+SAM+树上倍增
bzoj3676 [Apio2014]回文串 SAM+树上倍增 链接 bzoj luogu 思路 根据manacher可以知道,每次暴力扩展才有可能出现新的回文串. 所以推出本质不同的回文串个数是O( ...
随机推荐
- Mac下 Windows 7 虚拟机成功搭建SVN服务器后如何与Xcode建立联系,并上传原始工程的详细步骤
内容中包含 base64string 图片造成字符过多,拒绝显示
- DSP5509项目之用FFT识别钢琴音调(2)
1. 本节主要是学习TLV320AIC32这个音频芯片,Easy5509 开发板上有一个语音编解码芯片 TLV320AIC23.TLV320AIC23 是一个高性能的多媒体数字语音编解码器,它的内部 ...
- Django模板层之templates
一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...
- SQL Server 2008 R2 链接 Oracle 10g
首先sqlserver 链接oracle可以通过两个访问接口: “MSDAORA” 和“OraOLEDB.Oracle” 1.“MSDAORA”访问接口是由Microsoft OLE DB Provi ...
- Java 验证码识别库 Tess4j 学习
Java 验证码识别库 Tess4j 学习 [在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下 ...
- AnyProxy对搜狐汽车app抓包
关于AnyProxy 详细文档链接 http://anyproxy.io/cn/ anyproxy流程图 简要描述 当http请求经过代理服务器时,具体处理过程是: 收集请求所有请求参数,包括meth ...
- P,V操作及同步互斥实例
无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...
- Python字符串/元祖/列表/字典互转
#-*- coding:UTF-8 -*- #author:RXS002 #1.字典 dict = {'name':'Zara','age':7,'class':'First'} #字典转换为字符串, ...
- elasticserach + kibana环境搭建
一.java环境安装: 1.安装jdk,点击下一步即可. 2.环境变量配置 1) 找到jdk安装目录:C:\Program Files\Java\jdk1.8.0_161 2) 配置环境变量 ①找到环 ...
- 最全的NB-IoT芯片厂商、模组厂商信息
NB-IoT作为LPWAN(低功耗广域网)的新兴技术,因为具有低功耗.低成本.广覆盖.海量节点等优势,并且在授权频段可以与2G.3G无缝连接而被运营商所青睐且接受.特别是到了2017年,据统计全球有5 ...