题目好像难以看懂?

题目大意

给出一个字符串\(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 第二章 简单变量

    第二章 简单变量  by flamephoenix 一.整型 二.浮点数 三.字符串 基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串.一.整型 1.整型   PERL最常用的简单变量,由 ...

  2. C++头文件的包含顺序研究

    一.<Google C++ 编程风格指南>里的观点 公司在推行编码规范,领导提议基本上使用<Google C++ 编程风格指南>.其中<Google C++ 编程风格指南 ...

  3. hdoj 1247 Hat’s Words(字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 思路分析:题目要求找出在输入字符串中的满足要求(该字符串由输入的字符串中的两个字符串拼接而成)的 ...

  4. grunt用来压缩前端脚本

    grunt作为一个任务管理工具,提供丰富的插件和强大的自动化管理功能.需要安装node及npm. 主要使用到两个文件,一个是npm的依赖配置文件package.json { "name&qu ...

  5. probing元素

    https://msdn.microsoft.com/zh-cn/library/823z9h8w(v=vs.85).aspx 指定加载程序集时公共语言运行库要搜索的应用程序基子目录. <con ...

  6. C#调用C/C++动态库 封送结构体,结构体数组

    因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数 ...

  7. jQuery的扩展

    我们自己通过扩展jQuery来达到 “通过$.xx(paras)的形式来进行调用某个jQuery对象的xx(paras)方法”. 下面就是一个实例: (function(j){//这里的j是一个形参, ...

  8. UIView 设置阴影(属性说明)

    以下代码实现: 第一个图片的代码 //加阴影--任海丽编辑 _imageView.layer.shadowColor = [UIColor blackColor].CGColor;//shadowCo ...

  9. LNMP一键安装包sh脚本

    Xshell 5 (Build 0719) Copyright (c) 2002-2015 NetSarang Computer, Inc. All rights reserved. Type `he ...

  10. js,this,constrct ,prototype

    这一章我们将会重点介绍JavaScript中几个重要的属性(this.constructor.prototype), 这些属性对于我们理解如何实现JavaScript中的类和继承起着至关重要的作 th ...