【题解】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( ...
随机推荐
- HBase第二章 基本API
1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- 利用存储过程生成大量的数据(oracle,mysql)
在进行查询操作的性能测试时,往往需要测试大数据量模式下的查询功能的性能,这是就需要我们去创造一些测试数据来填充数据库,来模拟真是环境,造数据的方式有很多种,可以使用loadrunner,jmeter等 ...
- Entity Framework for Oracle 基本配置
1.需要安装ODAC 如果不安装ODAC,在数据源连接的配置中,看不到Oracle的选项 我下载安装的组件是32-bit Oracle Data Access Components (ODAC) w ...
- C#是数据类型
C#又开始了 开始数据类型 用的软件是VS2017 E short 短整型 int 中等整型 long 长整形 string 字符串类型 bool 布尔类型(true/flase) 相当于数 ...
- hdu2065"红色病毒"问题(指数母函数+快速幂取模)
"红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Spine with Unity Mecanim
前言 最近这两天刚刚接触Spine,研究了一下Unity Mecanim Animator如何控制Spine,在此分享记录一下,如有不当之处,请留言指出,欢迎讨论. Unity & Spine ...
- 一学就会pip换镜像源
首先介绍一个国内好用的镜像站 阿里云 http://mirrors.aliyun.com/pypi/simple/ 豆瓣 http://pypi.douban.com/simple/ 清华大学 htt ...
- eBay:美国各州最受欢迎的产品品类
雨果网从美国媒体<商业内幕>8月26日的报道中获悉,电商巨头eBay近日发布了美国各州最受欢迎的产品品类.包括:加州人青睐女性高端配件,而新泽西 州的男人喜欢古龙香水.相比这些华丽配饰而言 ...
- Python基础知识-06-集合内存布尔False
python其他知识目录 1.判断一个字符串中是否有敏感字符? #str: m_str="我叫魔降风云变" if "魔" in m_str: #判断指定字符是否 ...
- [redis] linux下哨兵篇(3)
一.前言1.为何部署sentinel哨兵前文redis主从架构中,当主服务故障时,需要手动将从服务切换为主服务,sentinel服务就是将这个过程自动化.主要功能有:1)不时监控主从服务正常运行2)可 ...