P3900 [湖南集训]图样图森破
P3900 [湖南集训]图样图森破
分析:
感觉像个暴力。
可以枚举回文串的回文中心,即枚举一个串,枚举一个串的位置作为回文中心,然后求出这个串内的回文串的长度。
此时如果回文串两端都没有到这个串的端点,那么以这个点作为回文中心的长度就直接算出来了。
如果回文串的长度刚好是这个串的长度,那么INF。
如果回文串一侧到了端点,那么枚举所有串,看看能否加到另一侧,来构成回文串。此过程记忆化搜索即可。
复杂度$O(nL \log nL)$
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
int s[N], st[N], en[N], rnk[N], ht[N], sa[N], f[][N], Log[N], t1[N], t2[N], c[N], bel[N], dp[N][];
bool vis[N][];
char tmp[N];
int n, m; void getsa() {
int *x = t1, *y = t2, m = , i;
for (i = ; i <= m; ++i) c[i] = ;
for (i = ; i <= n; ++i) x[i] = s[i], c[x[i]] ++;
for (i = ; i <= m; ++i) c[i] += c[i - ];
for (i = n; i >= ; --i) sa[c[x[i]] --] = i;
for (int k = ; k <= n; k <<= ) {
int p = ;
for (i = n - k + ; i <= n; ++i) y[++p] = i;
for (i = ; i <= n; ++i) if (sa[i] > k) y[++p] = sa[i] - k;
for (i = ; i <= m; ++i) c[i] = ;
for (i = ; i <= n; ++i) c[x[y[i]]] ++;
for (i = ; i <= m; ++i) c[i] += c[i - ];
for (i = n; i >= ; --i) sa[c[x[y[i]]] --] = y[i];
swap(x, y);
p = ;
x[sa[]] = ;
for (i = ; i <= n; ++i)
x[sa[i]] = (y[sa[i]] == y[sa[i - ]] && y[sa[i] + k] == y[sa[i - ] + k]) ? p - : p ++;
if (p > n) break;
m = p;
}
for (int i = ; i <= n; ++i) rnk[sa[i]] = i;
int k = ;
ht[] = ;
for (int i = ; i <= n; ++i) {
if (rnk[i] == ) continue;
if (k) k --;
int j = sa[rnk[i] - ];
while (i + k <= n && j + k <= n && s[i + k] == s[j + k]) k ++;
ht[rnk[i]] = k;
}
Log[] = -;
for (int i = ; i <= n; ++i) Log[i] = Log[i >> ] + ;
for (int i = ; i <= n; ++i) f[][i] = ht[i];
for (int j = ; j <= Log[n]; ++j)
for (int i = ; i + ( << j) - <= n; ++i)
f[j][i] = min(f[j - ][i], f[j - ][i + ( << (j - ))]);
}
int query(int l,int r) {
if (l == r) return 1e9;
l = rnk[l], r = rnk[r];
if (l > r) swap(l, r);
l ++;
int k = Log[r - l + ];
return min(f[k][l], f[k][r - ( << k) + ]);
}
int getlcp(int x,int y) {
return min(query(x, n - y + ), min(en[bel[x]] - x + , y - st[bel[y]] + ));
}
void End() {
puts("Infinity"); exit();
}
int dfs(int x,int t) {
if (vis[x][t]) End();
if (dp[x][t]) return dp[x][t];
vis[x][t] = ;
if (!t) {
for (int i = ; i <= m; ++i) {
int k = getlcp(x, en[i]), l = en[i] - k + , r = x + k - ;
if (r != en[bel[x]] && l != st[i]) dp[x][t] = max(dp[x][t], k * );
else if (r == en[bel[x]] && l == st[i]) End();
else if (r == en[bel[x]]) dp[x][t] = max(dp[x][t], k * + dfs(l - , ));
else dp[x][t] = max(dp[x][t], k * + dfs(r + , ));
}
}
else {
for (int i = ; i <= m; ++i) {
int k = getlcp(st[i], x), l = x - k + , r = st[i] + k - ;
if (l != st[bel[x]] && r != en[i]) dp[x][t] = max(dp[x][t], k * );
else if (l == st[bel[x]] && r == en[i]) End();
else if (l == st[bel[x]]) dp[x][t] = max(dp[x][t], k * + dfs(r + , ));
else dp[x][t] = max(dp[x][t], k * + dfs(l - , ));
}
}
vis[x][t] = ;
return dp[x][t];
}
int main() {
m = read();
for (int i = ; i <= m; ++i) {
scanf("%s", tmp + );
int len = strlen(tmp + );
st[i] = n + ;
for (int j = ; j <= len; ++j) s[++n] = tmp[j] - 'a' + , bel[n] = i;
en[i] = n;
}
for (int i = ; i <= n; ++i) s[i + n] = s[n - i + ];
n <<= ;
getsa();
int ans = ;
for (int i = ; i <= m; ++i)
ans = max(ans, max(dfs(st[i], ), dfs(en[i], )));
for (int i = ; i <= m; ++i) {
for (int j = st[i]; j <= en[i]; ++j) {
int k = getlcp(j, j), l = j - k + , r = j + k - ;
if (l != st[i] && r != en[i]) ans = max(ans, k * - );
else if (l == st[i] && r == en[i]) End();
else if (l == st[i]) ans = max(ans, k * - + dfs(r + , ));
else ans = max(ans, k * - + dfs(l - , ));
}
for (int j = st[i]; j < en[i]; ++j) {
int k = getlcp(j + , j), l = j - k + , r = j + k; // r = j + 1 + k - 1 !!!
if (l != st[i] && r != en[i]) ans = max(ans, k * );
else if (l == st[i] && r == en[i]) End();
else if (l == st[i]) ans = max(ans, k * + dfs(r + , ));
else ans = max(ans, k * + dfs(l - , ));
}
}
cout << ans;
return ;
}
P3900 [湖南集训]图样图森破的更多相关文章
- BZOJ3654 : 图样图森破
考虑枚举回文中心,然后向两边扩展,当匹配到当前串的边界的时候,枚举下一个串接上. 这个过程可以通过记忆化搜索来完成,设: $f[i][0]$表示对于$i$这个位置,$[i,串结尾]$等待匹配的最长回文 ...
- Bzoj 3654 图样图森波 题解
3654: 图样图森破 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 123 Solved: 66[Submit][Status][Discuss] ...
- 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生
题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...
- bzoj 3653 [湖南集训]谈笑风生
题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...
- luogu P3899 [湖南集训]谈笑风生
传送门 nmyzd,mgdhls,bnmbzdgdnlql,a,wgttxfs 对于一个点\(a\),点\(b\)只有可能是他的祖先或者在\(a\)子树里 如果点\(b\)是\(a\)祖先,那么答案为 ...
- 洛谷P3899 [湖南集训]谈笑风生(线段树合并)
题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...
- P3899 [湖南集训]谈笑风生
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P38 ...
- LG3898 [湖南集训]大新闻
题意 题目描述 **记者弄了个大新闻,这个新闻是一个在 [0,n) 内等概率随机选择的整数,记其为 x.为了尽可能消除这个大新闻对公众造成的不良印象,我们需要在 [0,n)内找到某一个整数 y,使得 ...
- 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)
题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...
随机推荐
- 一些centos 6和centos 7的区别
CentOS 6(OLE 6,RHEL 6类似) CcnetOS 7(OLE 7,RHEL 7类似) 影响 默认文件系统 ext4 xfs 大量小文件在ext4上工作性能较好在64位linux中, ...
- SQL语句还原数据库并移动文件到指定路径
用SQL语句还原数据库时如果不指定数据库文件的存储路径,则默认把数据文件和日志文件存放到与原数据库相同的文件路径中,这样可能会产生错误,比如执行下面的语句: restore database Smar ...
- 封装NSMapTable并简易的使用
封装NSMapTable并简易的使用 NSMapTable是弱引用的字典,可以用来存储对象,该对象消失了也没有关系,对于控制器越级跳转相当有用:) WeakDictionary.h 与 WeakDic ...
- Linux ss命令详解
ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息 ...
- IP地址分类和网段区分的知识
IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段 简单来说在公司或企业内部看到的就基本都是内网IP,ABC三类IP地址里的常见IP段. 每个IP地址都包含两部分,即网络号 ...
- THE CUP OF LIFE即生命之杯。
生命之杯 编辑 THE CUP OF LIFE即生命之杯. <生命之杯>(西班牙语:La copa de la vida,英语:The Cup of Life)是一首由波多黎各裔歌手瑞奇· ...
- app数据加密方法
由于项目涉及到注册和登录,所以我了解一下现在app使用比较广泛的几种密码加密方法,可以当作参考,以下都是在python3.5的环境下使用这些算法的例子. 1.base64 Base64是一种基于64个 ...
- 关于markdown格式的测试..
标题 标题一 这是? 标题二 标题三 标题四 区块 1.这是一个列表项目 还是吗? 嵌套了? 空格了? 区块加列表 标题加二级列表 嘿嘿 无序列表 RED GREEN BLUE 有序列表 dog ca ...
- 在web.xml中配置404错误拦截
<error-page> <error-code>404</error-code> <location>/home.do</location> ...
- 前端技术-HTML页面的加载
HTML页面的加载 HTML页面的加载实际上是基于http过程+浏览器对数据的解析渲染. http协议的请求过程是基于TCP协议的.http是要基于TCP连接基础上,简单的说,TCP单纯建立连接,不涉 ...