bzoj3756: Pty的字符串
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 800005
#define maxm 1600005
#define maxl 1600005
#define ll long long
using namespace std;
int n,cnt,m,last,root,tot,val[maxl],now[maxn],son[maxl],prep[maxl],ri[maxm],fa[maxm],dist[maxm],tmp[maxm];
ll sum[maxm],ans;
char st[maxn*];
struct Tsegment{
int son[maxm][];
void prepare(){tot=last=root=,memset(ri,,sizeof(ri)),memset(son,,sizeof(son)),memset(dist,,sizeof(dist));}
int newnode(int x){
dist[++tot]=x; return tot;
}
int add(int x,int p){
int q=son[p][x];
if (q==){
int np=newnode(dist[p]+); last=np; ri[np]=;
for (;p&&!son[p][x];p=fa[p]) son[p][x]=np;
if (p==) fa[np]=root;
else{
int q=son[p][x];
if (dist[p]+==dist[q]) fa[np]=q;
else{
int nq=newnode(dist[p]+);
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q],fa[q]=fa[np]=nq;
for (;p&&son[p][x]==q;p=fa[p]) son[p][x]=nq;
}
}
}else{
if (dist[p]+==dist[q]) last=q,ri[q]++;
else{
int nq=newnode(dist[p]+); last=nq; ri[nq]=;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q],fa[q]=nq;
for (;p&&son[p][x]==q;p=fa[p]) son[p][x]=nq;
}
}
return last;
}
void Tsort(){
memset(sum,,sizeof(sum));
for (int i=;i<=tot;i++) sum[dist[i]]++;
for (int i=;i<=n;i++) sum[i]+=sum[i-];
for (int i=;i<=tot;i++) tmp[sum[dist[i]]--]=i;
memset(sum,,sizeof(sum));
for (int x,i=tot;i>=;i--){
x=tmp[i];
if (fa[x]) ri[fa[x]]+=ri[x];
}
ri[root]=,dist[root]=dist[]=;
for (int x,i=;i<=tot;i++){
x=tmp[i];
sum[x]=ri[x]*(dist[x]-dist[fa[x]]);
if (fa[x]) sum[x]+=sum[fa[x]];
}
sum[root]=;
}
void work(){
int len=; last=root; ans=;
for (int x,i=;i<=m;i++){
x=st[i]-'a';
if (son[last][x]) len++,last=son[last][x];
else{
for (;last&&!son[last][x];last=fa[last]);
if (last==) last=root,len=;
else{
len=dist[last]+,last=son[last][x];
}
}
if (last!=root&&last){
ans+=(sum[fa[last]]+(len-dist[fa[last]])*ri[last]);
}
}
printf("%lld\n",ans);
}
}SAM;
struct Graph{
void add(int x,int y,int z){
cnt++,prep[cnt]=now[x],now[x]=cnt,son[cnt]=y,val[cnt]=z;
}
void dfs(int x,int goal){
for (int i=now[x],so=son[i];i;i=prep[i],so=son[i]){
int p=SAM.add(val[i],goal);
dfs(so,p);
}
}
}G;
int main(){
scanf("%d",&n);
cnt=ans=,memset(now,,sizeof(now));
for (int i=,u,v;i<=n;i++){
scanf("%d%s",&u,st+);
G.add(u,i,st[]-'a');
}
SAM.prepare();
G.dfs(,);
SAM.Tsort();
scanf("%s",st+),m=strlen(st+);
SAM.work();
return ;
}
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3756
题目大意:

bzoj3756: Pty的字符串的更多相关文章
- 【BZOJ3756】Pty的字符串(广义后缀自动机)
题意: 思路:论文题 建立Trie树的后缀自动机需要换这个长的板子 #include<bits/stdc++.h> using namespace std; typedef long lo ...
- Pty的字符串(string)
题目描述 在神秘的东方有一棵奇葩的树,它有一个固定的根节点(编号为1).树的每条边上都是一个字符,字符为a,b,c中的一个,你可以从树上的任意一个点出发,然后沿着远离根的边往下行走,在任意一个节点停止 ...
- [JZOJ3402] 【GDOI2014模拟】Pty的字符串
题目 给你一棵每条边从父亲指向儿子的树,每条边上面有一个字母. 从树上的任意一点出发,走出的路径就是对应一个子串. (这不是\(Trie\),因为每个父亲可能会连出字母相同的边) 再给你一个字符串\( ...
- [BZOJ 2894]世界线
传送门 \(\color{green}{solution}\) 在开这道题之前建议先看看3756:pty的字符串,然后你会发现这题就很zz了. 当然,作为一名合格的博主,我还是应该写点什么的 首先,我 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- (从终端看linux-1)linux tty pty pts 概念 区别
基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东 ...
- Linux中tty、pty、pts的概念区别
转自Linux中tty.pty.pts的概念区别 基本概念: 1> tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过 ...
- Linux中tty、pty、pts的概念区别 转载
基本概念: > tty(终端设备的统称): tty一词源于Teletypes,或teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西 ...
- 字符串的朴素模式和KMP模式匹配
先复习一下字符串指针: #include <iostream> #include <string.h> using namespace std; int main() { ch ...
随机推荐
- 数据表格 - DataGrid - 列表显示
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding=& ...
- NET Core中怎么使用HttpContext.Current
NET Core中怎么使用HttpContext.Current 阅读目录 一.前言 二.IHttpContextAccessor 三.HttpContextAccessor 回到目录 一.前言 我们 ...
- C#加密解密大全
1.方法一 (不可逆加密) public string EncryptPassword(string PasswordString,string PasswordFormat ) { ...
- JavaScript系列:正则表达式
function testExecResultType() { var txt = "mom and dad and baby"; var pattern = /mom (and ...
- MPI+WIN10并行试运行
系统:2015 win10专业版 x64 MPI安装包:mpich2-1.4.1p1-win-x86-64.man 将后缀改为.msi 以管理员身份安装 安装过程一路默认,注意<behappy为 ...
- WP8.1中C++的winodws运行时组件位移操作的差异
最近学习WP8.1应用开发,想把C语言的SM3国密算法移植到手机app中.由于把C语言的代码转换成C#代码工作量较大,因此只能用winodws运行时组件来实现. SM3国密算法是一种HASH算法,具体 ...
- NVelocity学习笔记一——linq2sql+NVelocity完整demo
(一)前言 刚刚进入新公司,看公司的项目,发现开发流程几乎和以前的完全不同,再看看页面布局竟然没有发现html.神马情况????一番探究发现使用了NVelocity模板引擎开发的.于是乎花了 ...
- Android 开发1000问笔记
11.android使用全局变量 定义Data类继承Application 在manifest.xml中声明 http://blog.csdn.net/feiyangxiaomi/article/de ...
- VS代码管理插件AnkhSvn
下载AnKHSvn软件,启动VS,源代码管理工具选择AnKHSvn 在视图-〉其它窗口-〉Pending Change->提交变化的更改
- Linux C中结构体初始化
在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式.该方式是某些C教材(如谭二版.K&R二版)中没有介绍过的.这种方式称为指定初始化(designated in ...