题目好像难以看懂?

题目大意

给出一个字符串\(S\),统计满足以下条件的\((i,j,p,q)\)的数量。

  • \(i \leq j, p \leq q\)
  • \(S[i..j],S[p..q]\)是回文串
  • \(i < p\)或(\(i=p\)且\(j <q\))
  • \(p \leq j\)

算法

实在没懂硬求的算法,lyw lzhOrz。

我们来愉快地求补集吧:

全集很好求,接下来,枚举\(j\),我们可以求出满足\(S[i..j]\)的\(i\)的数量\(x\),然后减去\(p > j\)的\(S[p..q]\)的数量乘上\(x\)。

问题是如何求出满足\(S[i..j]\)的\(i\)的数量,这个直接套用回文树的做法即可。

\(p > j\)的\(S[p..q]\)的数量求法同理,只要加上一个部分和即可。

不过好像回文树还没有普及,事实上可以用Manacher算法求出的东西来达到同样的效果。

然后我就想了,既然Manacher在该问题中能达到回文树的效果,那么回文树能不能算出Manacher算出的东西呢???????

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; const int MAXN = (int) 2e6 + 3;
const int MOD = (int) 1e9 + 7; typedef long long i64; int n;
char str[MAXN]; struct Node {
Node* s[26];
Node* fail;
int len, cnt;
}; Node memory[MAXN];
Node* curMem = memory;
Node* root0;
Node* root1; Node* getFail(Node* x, int i) {
while (i == x->len || str[i] != str[i - x->len - 1])
x = x->fail;
return x;
} void solve(int ans[]) {
Node* cur = root1;
for (int i = 0; i < n; i ++) {
int p = str[i] - 'a';
cur = getFail(cur, i);
if (! cur->s[p]) {
Node* x = curMem ++;
x->len = cur->len + 2;
cur->s[p] = x; if (cur == root1)
x->fail = root0;
else
x->fail = getFail(cur->fail, i)->s[p];
x->cnt = x->fail->cnt + 1;
}
cur = cur->s[p];
ans[i] = cur->cnt;
}
} int main() {
#ifdef debug
freopen("input.txt", "r", stdin);
#endif
scanf("%d\n", &n);
scanf("%s", str); static int A[MAXN], B[MAXN];
root0 = curMem ++;
root1 = curMem ++;
root1->len = -1;
root0->fail = root1; solve(A);
reverse(str, str + n);
solve(B);
reverse(B, B + n);
for (int i = n - 1; i >= 0; i --)
B[i] = (B[i] + B[i + 1]) % MOD;
i64 ans = (i64) B[0] * (B[0] - 1) % MOD * 500000004 % MOD; for (int i = 0; i + 1 < n; i ++)
ans = (ans - (i64) A[i] * B[i + 1]) % MOD;
if (ans < 0) ans += MOD;
cout << ans << endl; return 0;
}

花海漫步 NOI模拟题的更多相关文章

  1. NOI模拟题1 Problem A: sub

    题面 Sample Input 5 7 2 -1 -3 1 1 1 2 1 3 3 4 3 5 2 1 3 0 2 1 2 1 2 1 1 -3 2 Sample Output 2 4 5 2 HIN ...

  2. 神奇的矩阵 NOI模拟题

    神奇的矩阵 题目大意 有一个矩阵\(A\),第一行是给出的,接下来第\(x\)行,第\(y\)个元素的值为数字\(A_{x-1,y}\)在\(\{A_{x-1,1},A_{x-1,2},A_{x-1, ...

  3. NOI模拟题6 Problem C: Circle

    Solution 首先这个矩阵, 很明显的就是Vandermonde矩阵. 我们有公式: \[ |F_n| = \prod_{1 \le j < i \le n} (a_i - a_j) \] ...

  4. NOI模拟题5 Problem A: 开场题

    Solution 注意到\(\gcd\)具有结合律: \[ \gcd(a, b, c) = \gcd(a, \gcd(b, c)) \] 因此我们从后往前, 对于每个位置\(L\), 找到每一段不同的 ...

  5. NOI模拟题4 Problem C: 填格子(board)

    Solution 首先我们要有敏锐的直觉: 我们将每一列中不选哪种颜色看作是一个序列, 则我们发现这个序列要求相邻两位的颜色不同. 我们还发现, 一个这样的序列对应两种不同的合法的棋盘, 因此统计合法 ...

  6. NOI模拟题4 Problem B: 小狐狸(fox)

    Solution 考虑分开统计朝向每一个方向的所有狐狸对答案的贡献. 比如说以向右为例, 我们用箭标表示每一只狐狸的方向, 用\('\)表示当前一步移动之前的每一只狐狸的位置. \[ \begin{a ...

  7. NOI模拟题4 Problem A: 生成树(mst)

    Solution 我们考虑答案的表达式: \[ ans = \sqrt{\frac{\sum_{i = 1}^{n - 1} (w_i - \overline{w})^2}{n - 1}} \] 其中 ...

  8. 5.23 NOI 模拟

    $5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...

  9. poj 1008:Maya Calendar(模拟题,玛雅日历转换)

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 D ...

随机推荐

  1. perl5 第十三章 Perl的面向对象编程

    第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...

  2. HDU 1276 士兵队列训练问题

    模拟题,学了一下list it=li.erase(it):指向删除后的第一个元素 #include <cstdio> #include <list> using namespa ...

  3. HDU 2717 Catch That Cow

    简单的广搜: #include <cstdio> #include <queue> using namespace std; ],step[]; int n,start,end ...

  4. Flex控件初始化问题

    有个对话框mx:TitleWindow->mx:TabNavigator->里有两个mx:Tile,每个Tile里都有个datagrid.测试如下:1.对话框显示后,马上动态监测第二个ti ...

  5. Xvfb+YSlow+ShowSlow搭建前端性能测试框架 - 前端技术 | TaoBaoUED

    Xvfb+YSlow+ShowSlow搭建前端性能测试框架 - 前端技术 | TaoBaoUED Xvfb+YSlow+ShowSlow搭建前端性能测试框架 作者:黑三 | 时间:2010-07-07 ...

  6. 页面布局之BFC 微微有点坑

    一.什么是BFC: 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观点来说 ...

  7. DevExpress ASP.NET 使用经验谈(8)-ASPxGridView自定义列和基本事件

    为演示本节示例,我们在原来Users表增加[性别Gender].[兴趣爱好Hobbies],[CreateTime创建时间],[ModifyTime]修改时间这4个字段, ALTER TABLE [d ...

  8. Arduino 跷跷板(2016-01-04)

    前言这是参加社区活动,用赠送的 LilyPad 来做小实验,也体验了一把艺术的LilyPad!本来是申请 nano 的,不知道怎么的就出错啦,申请成 LilyPad 了,这个实验应该用 nano 比较 ...

  9. CentOS-6.3安装配置JDK-7或 JDK-6

    链接地址:http://blog.csdn.net/shuixin536/article/details/8954000 http://www.cnblogs.com/zhoulf/archive/2 ...

  10. Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...