hdu5157 Harry and magic string【manacher】
Harry and magic string
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 576    Accepted Submission(s): 287
Problem Description
Harry got a string T, he wanted to know the number of T’s disjoint palindrome substring pairs. A string is considered to be palindrome if and only if it reads the same backward or forward. For two substrings of T:x=T[a1…b1],y=T[a2…b2](where a1 is the beginning index of x,b1 is the ending index of x. a2,b2 as the same of y), if both x and y are palindromes and b1<a2 or b2<a1 then we consider (x, y) to be a disjoint palindrome substring pair of T.
Input
There are several cases.
For each test case, there is a string T in the first line, which is composed by lowercase characters. The length of T is in the range of [1,100000].
Output
For each test case, output one number in a line, indecates the answer.
Sample Input
aca aaaa
Sample Output
3 15
Hint
For the first test case there are 4 palindrome substrings of T. They are: S1=T[0,0] S2=T[0,2] S3=T[1,1] S4=T[2,2] And there are 3 disjoint palindrome substring pairs. They are: (S1,S3) (S1,S4) (S3,S4). So the answer is 3.
Source
Recommend
heyang | We have carefully selected several similar problems for you: 6447 6446 6445 6444 6443
题意:
在一个S串中找两个回文串,两个回文串没有重叠的部分。问有多少个这样的回文串对。
思路:
用manacher我们可以求出以$i$为中心的回文串的个数。
$pre[i]$表示以$i$为开头的回文串的个数,$suf[i]$表示以$i$为结尾的回文串的个数。
那么我们要求的答案其实就是$\sum_{i = 1}^{len} pre[i] * (\sum_{j=1}^{i-1} suf[j])$
所以我们再用一个数组$sum$来存$suf$数组的前缀和。
那么$pre$和$suf$怎么求呢?
我们manacher处理出的$p[i] /2$表示的是以$i$为中心的回文的个数。
那么对于$i$之前的半径内的字符,他们的$pre$可以$+1$。同样他之后的半径内的字符,$suf$可以$-1$
暴力统计肯定是不行的,我们可以使用差分的思想。
对于$[i,j]$区间内的每一个数都更新$k$的话,我们可以用一个数组$add[i] += k$,add[j+1] -=k$
然后从前往后求前缀和得到的就是对区间的全部更新了。求$suf$和$pre$也是同样的道理。
$pre$是后面影响前面的所以从后往前求“#”向前靠,$suf$从前往后求“#”向后靠。
#include<iostream>
//#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
//#include<cstdlib>
#include<cstring>
#include<algorithm>
//#include<queue>
#include<vector>
//#include<set>
//#include<climits>
//#include<map>
using namespace std;
typedef long long LL;
#define N 100010
#define pi 3.1415926535
#define inf 0x3f3f3f3f const int maxn = 1e5 + ;
char s[maxn], ss[maxn * ];
LL pre[maxn * ], suf[maxn * ], sum[maxn * ];
int lens, p[maxn * ]; int init()
{
ss[] = '$';
ss[] = '#';
int lenss = ;
for(int i = ; i < lens; i++){
ss[lenss++] = s[i];
ss[lenss++] = '#';
}
ss[lenss] = '\0';
return lenss;
} void manacher()
{
int lenss = init();
int id, mx = ;
for(int i = ; i < lenss; i++){
if(i < mx){
p[i] = min(p[ * id - i], mx - i);
}
else{
p[i] = ;
}
while(ss[i - p[i]] == ss[i + p[i]])p[i]++;
if(mx < i + p[i]){
id = i;
mx = i + p[i];
} }
} int main()
{
while(scanf("%s", s) != EOF){
lens = strlen(s);
/*for(int i = 0; i < lens * 2 + 3; i++){
p[i] = 0;
}*/
for(int i = ; i < lens + ; i++){
suf[i] = pre[i] = sum[i] = ;
} manacher(); for(int i = ; i <= lens * ; i++){
int x = (i + ) / ;//向上取整
suf[x]++, suf[x + (p[i] / )]--;
}
for(int i = lens * ; i >= ; i--){
int x = i / ;
pre[x]++, pre[x - (p[i] / )]--;
} for(int i = lens; i >= ; i--){
pre[i] += pre[i + ];
}
for(int i = ; i <= lens; i++){
suf[i] += suf[i - ];
sum[i] += sum[i - ] + suf[i];
}
LL ans = ;
for(int i = ; i <= lens; i++){
ans += (LL)pre[i] * sum[i - ];
}
printf("%I64d\n", ans);
}
return ;
}
hdu5157 Harry and magic string【manacher】的更多相关文章
- Switch选择语句能否作用在String【字符串】上,也就是能否这么写:Switch(一个字符串变量)?
		
Switch选择语句能否作用在String[字符串]上,也就是能否这么写:Switch(一个字符串变量)? 解答:不可以,只能处理int,byte,short,char,(其实是只能处理int,其它三 ...
 - 345. Reverse Vowels of a String【easy】
		
345. Reverse Vowels of a String[easy] Write a function that takes a string as input and reverse only ...
 - 344. Reverse String【easy】
		
344. Reverse String[easy] Write a function that takes a string as input and returns the string rever ...
 - 【Manacher】Colorful String
		
The value of a string s is equal to the number of different letters which appear in this string. You ...
 - 【manacher】HDU3068-最长回文
		
[题目大意] 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. [manacher知识点] ①mx - i > P[j] 的时候,以S[j]为中心的回文子串 ...
 - Codeforces Round #445 D. Restoration of string【字符串】
		
D. Restoration of string time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
 - 【manacher】HDU4513-吉哥系列故事——完美队形II
		
[题目大意] 求最长回文队伍且队伍由中间向两边递减. [思路] 和字符串一样的做法,在递推的时候增加判断条件:a[i-p[i]]<=a[i-p[i]+2]. #include<iostre ...
 - 2018ACM-ICPC南京区域赛M---Mediocre String Problem【exKMP】【Manacher】
		
这题就单独写个题解吧.想了两天了,刚刚问了一个大佬思路基本上有了. 题意: 一个串$S$,一个串$T$,在$S$中选一段子串$S[i,j]$,在$T$中选一段前缀$T[1,k]$使得$S[i,j]T[ ...
 - 2015 UESTC Training for Search Algorithm & String - M - Palindromic String【Manacher回文串】
		
O(n)的复杂度求回文串:Manacher算法 定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串 现在给一个2*10^6长度 ...
 
随机推荐
- httpclient检查某个链接是否可用
			
private boolean checkUrlIsValid(String url) { CloseableHttpClient httpClient = HttpClients.createDef ...
 - SNF快速开发平台WinForm-CS甘特图
			
我们在做项目当中会经常用到按时间进度查看任务,其通过条状图来显示项目,进度,和其他时间相关的系统进展的内在关系随着时间进展的情况. 甘特图包含以下三个含义: 1.以图形或表格的形式显示活动: 2.通用 ...
 - pandas DataFrame(3)-轴
			
和numpy数组(5)-二维数组的轴一样,pandas DataFrame也有轴的概念,决定了方法是对行应用还是对列应用: 以下面这个数据为例说明: 这个数据是5个车站10天内的客流数据: rider ...
 - ES6,Array.from()函数的用法
			
ES6为Array增加了from函数用来将其他对象转换成数组. 当然,其他对象也是有要求,也不是所有的,可以将两种对象转换成数组. 1.部署了Iterator接口的对象,比如:Set,Map,Arra ...
 - ③NuPlayer播放框架之类NuPlayer源码分析
			
[时间:2016-10] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架] 0 引言 差不多一个月了,继续分析AOSP的播放框架的源码.这次我们需要深入分析的是N ...
 - 转:pycharm community debug django projects
			
原文:https://automationpanda.com/2017/09/14/django-projects-in-pycharm-community-edition/comment-page- ...
 - LeetCode: Subsets  解题报告
			
Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...
 - Java知多少(2)虚拟机(JVM)以及跨平台原理
			
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...
 - yum常用命令大全
			
yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性 ...
 - 将Java web应用部署到Tomcat 及部署到Tomcat根目录 的三种方式
			
Tomcat作为Servlet/JSP容器(服务器)挺不错的,开源免费,需要知道的是Tomcat是一个Web服务器,其符合Servlet/JSP规范,但是却没有实现所有JavaEE规范,所以我们还是应 ...