hiho1602本质不同的回文子串的数量
给定一个字符串S,请统计S的所有子串中,有多少个本质不同的回文字符串?
注意如果两个位置不同的子串满足长度相同且对应字符也都相同,则认为这两个子串本质上是相同的。
Input
一个只包含小写字母的字符串S。
对于30%的数据,S长度不超过100。
对于60%的数据,S长度不超过1000。
对于100%的数据,S长度不超过800000。
Output
回文子串的数量
Sample Input
abbab
Sample Output
5
马拉车算法+bkrdhash:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<map>
using namespace std;
#define ULL unsigned long long
const int maxn=+;
ULL P = ;
ULL sqr[maxn/],has[maxn/],V[maxn]; int Laxt[maxn],Next[maxn],cnt=; const int MOD = ; bool _insert(ULL Now)
{
int u=Now%MOD;
for(int i=Laxt[u];i;i=Next[i]){
if(V[i]==Now) return true;
}
Next[++cnt]=Laxt[u];
Laxt[u]=cnt;
V[cnt]=Now;
return false;
}
int ans=;void _hash(int x,int y){
ULL Now=has[y]-has[x-]*sqr[y-x+];
if(!_insert(Now)) ++ans;
}
void _malacher()
{
int R=,Mid=,Len;
char c[maxn];
scanf("%s",c+);
Len=strlen(c+);
sqr[]=;
for(int i=;i<=Len;i++){
sqr[i]=sqr[i-]*P;
has[i]=has[i-]*P+c[i];
}
int r[maxn];
for(int i=;i<=Len;++i) {
_hash(i,i);
if(R>i) r[i]=min(r[*Mid-i],R-i);
while(i+r[i]+<=Len&&c[i+r[i]+]==c[i-r[i]-]){
_hash(i-r[i]-,i+r[i]+);
r[i]++;
}
if(i+r[i]>R) {
R=i+r[i];
Mid=i;
}
} cnt=;Mid=;R=;
memset(Laxt,,sizeof(Laxt));
memset(r,,sizeof(r));
for(int i=;i<=Len;++i) {
if(R>i) r[i]=min(r[*Mid-i],R-i+);
while(i+r[i]<=Len&&c[i+r[i]]==c[i-r[i]-]) {
_hash(i-r[i]-,i+r[i]);
++r[i];
}
if(i+r[i]->R) {
R=i+r[i]-;
Mid=i;
}
}
printf("%d\n",ans);
}
int main()
{
_malacher();
return ;
}
hiho1602本质不同的回文子串的数量的更多相关文章
- Hihocoder #1602 : 本质不同的回文子串的数量 manacher + BKDRhash
#1602 : 本质不同的回文子串的数量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串S,请统计S的所有子串中,有多少个本质不同的回文字符串? 注意如果 ...
- #1589 : 回文子串的数量(Manacher)
#1589 : 回文子串的数量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串S,请统计S的所有|S| * (|S| + 1) / 2个子串中(首尾位置不 ...
- 【HIHOCODER 1589】回文子串的数量(Manacher)
描述 给定一个字符串S,请统计S的所有|S| * (|S| + 1) / 2个子串中(首尾位置不同就算作不同的子串),有多少个是回文字符串? 输入 一个只包含小写字母的字符串S. 对于30%的数据,S ...
- WHU 583 Palindrome ( 回文自动机 && 本质不同的回文串的个数 )
题目链接 题意 : 给你一个串.要你将其划分成两个串.使得左边的串的本质不同回文子串的个数是右边串的两倍.对于每一个这样子的划分.其对答案的贡献就是左边串的长度.现在要你找出所有这样子的划分.并将贡献 ...
- URAL 2037 Richness of binary words (回文子串,找规律)
Richness of binary words 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/B Description Fo ...
- LeetCode[5] 最长的回文子串
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 最长回文子串(Longest Palindromic Substring)
这算是一道经典的题目了,最长回文子串问题是在一个字符串中求得满足回文子串条件的最长的那一个.常见的解题方法有三种: (1)暴力枚举法,以每个元素为中心同时向左和向右出发,复杂度O(n^2): (2)动 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
随机推荐
- 03_zookeeper伪集群安装
一句话说明白:在1台机器上模拟多台机器,对外提供服务 在理解zookeeper集群安装方法的基础上,本文描述如何将1个机器模拟为3个节点的zookeeper集群,建议先参考阅读本文的前一期 zooke ...
- java的时间获取
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. currentTimeMillis方法 public static long currentTim ...
- RNAseq 流程
https://github.com/twbattaglia/RNAseq-workflow
- LR--实现HTTP协议的接口测试
场景分析:使用LR完成HTTP协议的接口测试 流程: 1.首先需要找一个接口(POST.GET接口) 2.LR中点击Insert-->New Step-->web_custom_reque ...
- JSON的多样格式
//JSON – Properties 方便前台列表显示 [{"年月":2002.01,"北京分公司":2214688,"河北分公司":3 ...
- ASP.NET 4.5 MVC 4 无法运行在Windows2008的IIS7.0上显示404的解决方案
需要在web.config下加上这个 <system.webServer> <modules runAllManagedModulesForAllRequests="tru ...
- winmm.dll获取和设置声音
[DllImport("winmm.dll")] private static extern int waveOutGetVolume(IntPtr hwo, out uint d ...
- C++(三十) — this 指针
1.如何区分多个对象调用同一个类函数? 类外部访问类成员,必须用对象来调用.一个类的所有对象在调用的成员函数,都执行同一段代码,那成员函数如何区分属于哪个对象呢? 在对象调用成员函数时,除接收实参外, ...
- python 爬虫005-爬虫实例
实例一:扒取猫眼电影TOP100 的信息 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 扒取猫眼电影TOP100 的 ...
- buffer与cache的区别
top命令中有两项与内存相关的东西:buffer和cache.这两项与页高速缓存相关.磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的. 在linux内 ...