相似回文串

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 143  Solved: 68
[Submit][Status][Discuss]

Description

记S(i,j)为字符串S的第i个字母到第j个字母组成的子串。
给出一个长度为n由小写英文字母组成的字符串A。
若字符串B也由小写英文字母组成,长度为n,且对于任意1<=i<j<=n有:若A(i,j)是回文串,B(i,j)也是回文串;若A(i,j)不是回文串,B(i,j)也不是回文串。那么我们称B与A是ayq相似的。
求有多少个字符串与A ayq相似?输出答案对1000000007取模的余数。
 

Input

输入1行一个字符串A
 

Output

 
输出一行一个数表示所求答案
 

Sample Input

abcba

Sample Output

15600

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的更多相关文章

  1. 回文树(回文自动机) - BZOJ 3676 回文串

    BZOJ 3676 回文串 Problem's Link: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 Mean: 略 analyse: ...

  2. bzoj 3676 回文串 manachar+hash

    考虑每个回文串,它一定是它中心字母的最长回文串两侧去掉同样数量的字符后的一个子串. 所以我们可以用manachar求出每一位的回文半径,放到哈希表里并标记出它的下一个子串. 最后拓扑排序递推就行了.. ...

  3. BZOJ 2342 回文串-Manacher

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...

  4. BZOJ 2565 回文串-Manacher

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 题意:中文题 思路:定义L[i],R[i].表示以i为左端点/右端点时,最长回文串长 ...

  5. BZOJ 3676 回文串

    Description 考虑一个只包含小写拉丁字母的字符串\(s\).我们定义\(s\)的一个子串\(t\)的"出现值"为\(t\)在\(s\)中的出现次数乘以\(t\)的长度.请 ...

  6. BZOJ 3676 回文串(回文树)题解

    题意: 一个回文的价值为长度 * 出现次数,问一个串中的子串的最大回文价值 思路: 回文树模板题,跑PAM,然后计算所有节点出现次数. 参考: 回文串问题的克星--Palindrome Tree(回文 ...

  7. BZOJ4755 [JSOI2016]扭动的回文串 【后缀数组】【manacher】

    题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配 ...

  8. BZOJ 1006: [HNOI2008]神奇的国度(弦图染色)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1006 题意: 思路: 这个就是弦图染色问题,弦图啥的反正我也不懂,具体看论文https://wenk ...

  9. BZOJ - 3676 回文串 (回文树)

    https://vjudge.net/problem/HYSBZ-3676 题意 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s ...

随机推荐

  1. lintcode 二叉树中序遍历

    /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * Tr ...

  2. Oil Deposits(DFS连通图)

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...

  3. 20172333 2017-2018-2 《Java程序设计》第10周学习总结

    20172333 2017-2018-2 <Java程序设计>第10周学习总结 教材学习内容 第十三章 集合是一个对象,一个保存其他对象的数据库. 集合可以保存不同种类的对象也可以保存同种 ...

  4. Calculator Part Ⅰ (代码规范化修改)

    GitHub/object-oriented 本次参照的C++代码规范 有一些规范内容在文件中其实并未提及,比如:空格的使用,修改的时候真的是一头雾水--根据文件中的例子,发现了一些文字部分没有提到的 ...

  5. Spring学习(三)—— 自动装配案例分析

    Spring_Autowiring collaborators 在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配).byName,byType,construct ...

  6. ALPHA-3

    前言 失心疯病源3 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 16:00~20:18 援助行人模块并确定最终框架,顺便不死心的又找了一波车辆检测的dem ...

  7. Ansys Workbench热流固耦合仿真配置

    1.Fluent-Thermal-Structural瞬态分析 此模块连接在fluent已实现流体和固体的热流耦合,传递至thermal实际上只是将流体表面温度作为热载荷施加在固体的液体通道表面,极大 ...

  8. PHP连接Redis操作函数

    phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/ow ...

  9. vim 删除文件全部内容

    很多时候我们需要删除脚本文件全部内容, 重新再写入新的内容,进行其他的操作: 很多时候我们对应用程序的排错需要查看日志文件,然而日志中通常有许多我们以前的应用程序产生的日志,其他的日志过多的时候,有时 ...

  10. [C/C++] C++模板定义格式

    函数模板的格式: template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表) { //函数体 } 类模板的格式为: template<c ...