题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5787
题意:
找出所有相邻的回文串,将它们最外侧的端点坐标乘积都加起来,(i,j),(j+1,k) 两个回文串,将所有的i*k加和。
思路:
回文串直接用Manacher求解,然后对于所有的回文串都包含许多小的回文串,例如(i,j)回文串同时代表(i+1,j-1)等许多回文串,所以需要将更新的值看为一个区间,然后将所有区间求和,分别处理每个点作为回文串左右端点的情况,最后乘积求和即可。
代码:
//kopyh
#include <bits/stdc++.h>
#define MOD 1000000007
#define N 2000005
using namespace std;
int n,m,sum,res,flag,tot;
int p[N*2];
int Manacher(char *str)
{
int res=0,ans=0,len=strlen(str);
for(int i=len;i>=0;i--)
{
str[i+i+2] = str[i];
str[i+i+1] = '#';
}
str[0] &