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 ...
随机推荐
- Html5 Egret游戏开发 成语大挑战(五)界面切换和数据处理
经过前面的制作,使用Egret的Wing很快完成了开始界面和选关卡界面,下面通常来说就是游戏界面,但此时界面切换和关卡数据还没有准备好,这次讲解界面的切换和关卡数据的解析.前面多次修改了Main.ts ...
- 投入Html5的怀抱,最近在研究的Egret
html5没有办法不关注,实在太火热了,几年前还不行,如今确是环境较好,typescript语言很好学习,可能基于之前的基础,不到一个星期就基本上差不多了,虽然还有一些小问题,但那都是经验积累下来可以 ...
- TinyFrame升级之三:逻辑访问部分
在上一篇,我们打造了自己的数据访问部分,这篇,我们准备讲解如何打造逻辑访问部分. 在上一篇中,我们利用Repository模式构建了基于泛型的操作合集.由于这些操作的合集都是原子性的操作,也就是针对单 ...
- Cocos2d-x 3.4在AndroidStudio上编译配置
转载请标明出处:http://www.cnblogs.com/studweijun/p/4320778.html 1.准备好以下文件 1) AndroidStudio: https://dl.goo ...
- lecture12-玻尔兹曼机和受限玻尔兹曼机
这是Hinton的第12课,结合前一课可以知道RBM是来自BM,而BM是来自Hopfield的,因为水平有限,是直译的,虽然有时候会看不懂,但是好歹不会曲解原来的本意,看的话:1.先看ppt:2.通读 ...
- 你真的理解 new 了吗?
开篇先提几个问吧,如果你对这些问题都清楚了,那说明对于 new 这个关键字已经掌握得很好了,也不再需要花时间来阅读本文了, 1 new 一个class 与 new 一个Struct有什么 ...
- ModernUI教程:处理内容导航事件
Modern UI包含了一个机遇uri的内容导航框架用来处理区域加载.卸载和处理访问记录页面间的导航. 如果你希望你的页面具有这些处理事件,你需要继承一个IContent接口,该接口位于FirstFl ...
- Nginx 负载均衡
Nginx简单实现网站的负载均衡 地址:http://www.cnblogs.com/alvin_xp/p/4161162.html
- Webservice学习
参考博客1: http://www.cnblogs.com/lzhp/archive/2013/01/13/2858559.html 参考博客2:http://blog.csdn.net/shilei ...
- AJAX——核心XMLHttpRequest对象
AJAX大家已经都知道了,是为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,Jquery,Css……)重新融合的一个新的知识框架.而,XMLHttpR ...