bzoj 相似回文串 3350 3103 弦图染色+manacher
相似回文串
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 143 Solved: 68
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
对于100%的数据,n<=1000000
用Manacher可以推出O(n)对相等和不等关系。
将相等的用并查集维护,不等的连边。
然后从1到n,如果该等价类还没被考虑过,则ans*=26-与它不等的考虑过的等价类个数。
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector> #define N 1000007
#define mod 1000000007
#define fzy pair<int,int>
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m;
int i,r,p,f[N<<],fa[N],vis[N],ans=;
char a[N],s[N<<],col[N];
struct E{
int v;
E*nxt;
}*j,*h[N],pool[N<<],*cur=pool; int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
inline void merge(int x,int y)
{
if(x&)return;
if(find(x>>=)==find(y>>=))return;
fa[fa[x]]=fa[y];
}
inline void add(int x,int y)
{
if(!x||!y||x&)return;
j=cur++;j->v=y>>;j->nxt=h[x>>=];h[x]=j;
}
int main()
{
scanf("%s",a+),n=strlen(a+);
for(i=;i<=n;i++)
fa[i]=i;
for(i=;i<=n;i++)
s[i<<]=a[i],s[i<<|]='#';
s[]='$',s[]='#',s[m=(n+)<<]='@';
for(f[]=,i=;i<m;i++)
{
for(f[i]=r>i?min(r-i,f[p*-i]):;s[i-f[i]]==s[i+f[i]];f[i]++) merge(i+f[i],i-f[i]);
add(i+f[i],i-f[i]);
if(i+f[i]>r)r=i+f[i],p=i;
}
for(i=;i<=n;i++)
if(!col[find(i)])
{
for(p=,j=h[i];j;j=j->nxt)
if(col[find(j->v)]) if(vis[fa[j->v]]<i) vis[fa[j->v]]=i,p--;
col[fa[i]]=,ans=1LL*ans*p%;
}
printf("%d",ans);
}
bzoj 相似回文串 3350 3103 弦图染色+manacher的更多相关文章
- 回文树(回文自动机) - BZOJ 3676 回文串
BZOJ 3676 回文串 Problem's Link: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 Mean: 略 analyse: ...
- bzoj 3676 回文串 manachar+hash
考虑每个回文串,它一定是它中心字母的最长回文串两侧去掉同样数量的字符后的一个子串. 所以我们可以用manachar求出每一位的回文半径,放到哈希表里并标记出它的下一个子串. 最后拓扑排序递推就行了.. ...
- BZOJ 2342 回文串-Manacher
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...
- BZOJ 2565 回文串-Manacher
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 题意:中文题 思路:定义L[i],R[i].表示以i为左端点/右端点时,最长回文串长 ...
- BZOJ 3676 回文串
Description 考虑一个只包含小写拉丁字母的字符串\(s\).我们定义\(s\)的一个子串\(t\)的"出现值"为\(t\)在\(s\)中的出现次数乘以\(t\)的长度.请 ...
- BZOJ 3676 回文串(回文树)题解
题意: 一个回文的价值为长度 * 出现次数,问一个串中的子串的最大回文价值 思路: 回文树模板题,跑PAM,然后计算所有节点出现次数. 参考: 回文串问题的克星--Palindrome Tree(回文 ...
- BZOJ4755 [JSOI2016]扭动的回文串 【后缀数组】【manacher】
题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配 ...
- BZOJ 1006: [HNOI2008]神奇的国度(弦图染色)
http://www.lydsy.com/JudgeOnline/problem.php?id=1006 题意: 思路: 这个就是弦图染色问题,弦图啥的反正我也不懂,具体看论文https://wenk ...
- BZOJ - 3676 回文串 (回文树)
https://vjudge.net/problem/HYSBZ-3676 题意 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s ...
随机推荐
- 【RandomString】- 随机字符串
RandomString 随机字符串的用法
- 哈希表 -数据结构(C语言实现)
读数据结构与算法分析 哈希表 一种用于以常数平均时间执行插入.删除和查找操作的数据结构. 但是是无序的 一般想法 通常为一个包含关键字的具有固定大小的数组 每个关键字通过散列函数映射到数组中 冲突:两 ...
- JavaScript 正则
元字符 预定义类 边界 ^在中括号中时,匹配非hello的 str = 'hello world' str.match(/[^hello]/g) //[" ", "w&q ...
- 从SDN鼻祖Nicira到VMware NSX 网络虚拟化平台的简单探讨
以前的大二层技术,一般是在物理网络底层使用IS-IS路由技术,再在此基础之上,实现数据中心网络的二层扩展,如公有的Trill.SPB技术和Cisco私有的OTV.Fabricpath技术:前沿一些的网 ...
- lvs+keepalived详解
常用软件安装及使用目录 资源链接:https://pan.baidu.com/s/15rFjO-EnTOyiTM7YRkbxuA 网盘分享的文件在此 官网:http://www.linuxvir ...
- appcan打包后产生的问题总结
以appcan为基础的项目,最终需要打包后进行调试.在调试过程中,主要的样式问题在苹果手机上,下面将这些问题总结起来,以防下次再犯. 1:ios 7 以上的手机中,状态栏与内容重叠: 问题描述:在io ...
- A Compatible Pair
Description “年”是一个生活在海洋深处的怪物.每年,它都出现在陆地上,吞噬牲畜甚至是人.为了让怪物离开,人们用红色,光线和爆炸的声音填满他们的村庄,所有这些都吓跑了怪物. 小汤米有 n ...
- lintcode-187-加油站
187-加油站 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油gas[i],并且从第_i_个加油站前往第_i_+1个加油站需要消耗汽油cost[i]. 你有一辆油箱容量无限大的汽车,现在要从 ...
- c++移动文件夹
bool Files::MoveSampleFolder(string src_path,string dst_path) { int index = src_path.find_last_of(&q ...
- arp获取
getarp.c /* getarp.c -- This simple program uses an IOCTL socket call to read an entry */ /* from th ...