// 多校1005 HDU5785 Interesting
// 题意:给你一个串,求相邻两个回文串左边端点*右边端点的和
// 思路:马拉车算出最长回文半径,求一个前缀和,既得到每个点对答案的贡献。
// ans=L[i]*R[i-1]
// L[i] 以i开始的所有回文串结尾坐标的和
// R[i] 以i结尾的所有回文串开始坐标的和
// 这题我们关键是求L[] R[]
// 另开两个数组a[] b[] 分别记录当前点对答案贡献 和每个点出现的次数 // #pragma comment(linker, "/STACK:102c000000,102c000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
// #define rson mid+1,r,rt<<1|1
const int N = 1e6+;
const int MOD = 1e9+;
#define LL long long
#define LB long double
// #define mi() (l+r)>>1
double const pi = acos(-);
const double eps = 1e-;
void fre(){freopen("in.txt","r",stdin);}
inline int read(){int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-;ch=getchar();}while(ch>=''&&ch<='') { x=x*+ch-'';ch=getchar();}return x*f;} char str[N];
char s[N<<];
int Len[N<<];
void Manacher(int n){
clc(s,'#');
for(int i=;i<n;i++)
s[i*+]=str[i];
int len=n*+;s[]='$';
int mx=,po=;
for(int i=;i<=len;i++) {
if(mx>i)
Len[i]=min(Len[po*-i],mx-i);
else Len[i]=;
while(s[i+Len[i]]==s[i-Len[i]]) Len[i]++;
if(i+Len[i]>mx) { mx=i+Len[i];po=i;}
}
} LL a[N<<],b[N<<];
LL L[N],R[N];
int main(){
while(~scanf("%s",str)){
int len=strlen(str);
Manacher(len);
len=(len<<)+;
for(int i=;i<=len;i++) a[i]=,b[i]=;
for(int i=len;i>=;i--){
a[i-Len[i]+]+=i;
a[i+]-=i;
b[i-Len[i]+]++;
b[i+]--;
}
LL a1=,a2=;
for(int i=;i<=len;i++){
a1+=a[i],a2+=b[i];
if(i%==)
L[i/]=(a1-a2*i/)%MOD;
} for(int i=;i<=len;i++) a[i]=,b[i]=;
a1=,a2=;
for(int i=len;i>=;i--){
a[i]+=i;
a[i+Len[i]]-=i;
b[i]++;
b[i+Len[i]]--;
}
for(int i=;i<=len;i++){
a1+=a[i],a2+=b[i];
if(i%==)
R[i/]=(a1-a2*i/)%MOD;
} LL ans=;
for(int i=;i<=len/;i++){
ans=(ans+L[i]*R[i-]%MOD)%MOD;
}
printf("%I64d\n",ans);
}
return ;
}

多校1005 HDU5785 Interesting (manacher)的更多相关文章

  1. HDU5785 Interesting(Manacher + 延迟标记)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5785 Description Alice get a string S. She think ...

  2. 【HDU5785】Interesting [Manacher]

    Interesting Time Limit: 30 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description Input Outp ...

  3. HDU-5785 Interesting(Manacher算法+区间处理)

    题目大意:给一个字符串,求所有相邻两回文子串的外侧下标之积的和 题目分析:另L[i]为所有以 i 为右端点的回文字串的左端点之和,同理,另R[i]表示所有以 i 为左端点的回文子串的右端点之和.显然, ...

  4. HDU 4690 EBCDIC (2013多校 1005题 胡搞题)

    EBCDIC Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total Su ...

  5. 2015 多校联赛 ——HDU5371(manacher + 枚举)

    Sample Input 1 10 2 3 4 4 3 2 2 3 4 4   Sample Output Case #1: 9 要求找出一段数字. 将其分成3部分,第①和第②部分成回文字串,第②和第 ...

  6. Interesting (manacher + 前缀和处理)

    题意:相邻的两端回文串的价值为两个回文串总的区间左端点 × 区间右端点.然后计算目标串中所有该情况的总和. 思路:首先用manacher求出所有中心点的最大半径,然后我们知道对于左区间我们把贡献记录在 ...

  7. HDU 5785 Interesting manacher + 延迟标记

    题意:给你一个串,若里面有两个相邻的没有交集的回文串的话,设为S[i...j] 和 S[j+1...k],对答案的贡献是i*k,就是左端点的值乘上右端点的值. 首先,如果s[x1....j].s[x2 ...

  8. python库-collections模块Counter类

    Counter类主要是用来跟踪值出现的次数.它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value. demo: all_words = [] # 列表里面是汉字(可 ...

  9. 多校赛3- Solve this interesting problem 分类: 比赛 2015-07-29 21:01 8人阅读 评论(0) 收藏

    H - Solve this interesting problem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I ...

随机推荐

  1. [Unity菜鸟] FBX模型动画提取

    角色已经人形化(Humanoid)了,那它的动画可以用在其它的模型上了也就是可以共用一套模型动画了,但是你有没有发现那动画是和fbx模型绑在一起的,没关系你可以选中这几个动画文件按Contrl+D就可 ...

  2. Photoshop CS4序列号过期的问题

    1)在网络上搜寻一些PS CS4序列号: 如1330-1221-6824-4838-0308-6823,1330-1283-7461-4574-7002-2504,1330-1795-2880-537 ...

  3. 简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现。

    简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现. 题目: Suppose a sorted array is rotated at som ...

  4. (七)CSS定位(Positioning)

    CSS定位属性允许对元素进行定位. 一切皆为框: div.h1或p元素常被称为块级元素,而span和strong等元素成为行内元素,但是可是使用 display 属性改变框的类型,将display设置 ...

  5. 22.allegro中PCB打印设置[原创]

    1. -- 2. 3. 4. ----

  6. Ubuntu下jdk配置

    在Oracle官网下载linux版本的以tar.gz结尾的jdk建立文件夹用来存放解压后的jdksudo mkdir /usr/java进入jdk下载文件夹,解压并存放jdksudo tar zxvf ...

  7. 1320. Graph Decomposition

    1320 简单并查集 #include <iostream> #include<cstdio> #include<cstring> #include<algo ...

  8. UVa 11997 (优先队列 多路归并) K Smallest Sums

    考虑一个简单的问题,两个长度为n的有序数组A和B,从每个数组中各选出一个数相加,共n2中情况,求最小的n个数. 将这n2个数拆成n个有序表: A1+B1≤A1+B2≤... A2+B1≤A2+B2≤. ...

  9. UVa 12096 The SetStack Computer【STL】

    题意:给出一个空的栈,支持集合的操作,求每次操作后,栈顶集合的元素个数 从紫书给的例子 A={{},{{}}} B={{},{{{}}}} A是栈顶元素,A是一个集合,同时作为一个集合的A,它自身里面 ...

  10. cocos2d-x中的Jni使用(C++与Andriod方法互调)

    作者:何卫 转载请注明,原文链接:http://www.cnblogs.com/hewei2012/p/3376616.html 前提条件: 1.操作的游戏工程和cocos2d_x游戏引擎是一个目录的 ...