传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3756

题解:乱搞

代码:

 #include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define ll long long
#define maxn 1600005
using namespace std;
int val[maxn],fa[maxn],son[maxn][],ri[maxn],tmp[maxn],fin[maxn];
int d[maxn],tail=,head=,qq[maxn]; ll sum[maxn],ans;
char s[maxn*];
int n,m,tot,root,last;
int newnode(int x){val[++tot]=x; return tot;}
void extend(int x)
{
int p=last,np=newnode(val[p]+); 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 (val[p]+==val[q]) fa[np]=q;
else
{
int nq=newnode(val[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;
}
}
last=np;
}
void Tsort()
{
memset(d,,sizeof(d));
for(int i=;i<=tot;i++) d[fa[i]]++;
for(int i=;i<=tot;i++) if(d[i]==) qq[++tail]=i;
while(head<tail){
int x=qq[++head];
ri[fa[x]]+=ri[x];
if((--d[fa[x]])==) qq[++tail]=fa[x];
}
memset(sum,,sizeof(sum));
for (int i=; i<=tot; i++) sum[val[i]]++;
for (int i=; i<=tot; i++) sum[i]+=sum[i-];
for (int i=tot; i>=; i--) tmp[sum[val[i]]--]=i;
memset(sum,,sizeof(sum));
ri[root]=val[root]=val[]=;
for (int i=; i<=tot; i++)
{
int x=tmp[i];
sum[x]=1ll*ri[x]*(val[x]-val[fa[x]]);
if (fa[x]) sum[x]+=sum[fa[x]];
}
sum[root]=;
}
void work()
{
int len=;
scanf("%s",s+); m=strlen(s+); last=root;
for (int i=; i<=m; i++)
{
int x=s[i]-'a';
if (son[last][x]) last=son[last][x],len++;
else
{
for (; last && !son[last][x]; last=fa[last]) ;
if (last) len=val[last]+,last=son[last][x];
else len=,last=root;
}
if (last!=root&&last){
ans+=(sum[fa[last]]+1ll*(len-val[fa[last]])*ri[last]);
}
}
printf("%lld\n",ans);
}
int main()
{
scanf("%d\n",&n); char ch[];
tot=root=last=fin[]=;
for (int i=; i<=n; i++)
{
int k;
scanf("%d%s",&k,ch+); last=fin[k]; extend(ch[]-'a'); fin[i]=last;
}
Tsort();
work();
}

Fuck ls 看了ls错误建图,懒得改了。。。。

开始时间:+

结束时间:-

Bzoj3756的更多相关文章

  1. bzoj3756: Pty的字符串

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  2. 【BZOJ3756】Pty的字符串(广义后缀自动机)

    题意: 思路:论文题 建立Trie树的后缀自动机需要换这个长的板子 #include<bits/stdc++.h> using namespace std; typedef long lo ...

随机推荐

  1. Chapter 1 First Sight——15

    The red-haired woman looked up. "Can I help you?" 红头发的女人抬头看了一眼说,有什么我能帮助你的吗? "I'm Isab ...

  2. JavaScript数组函数unshift、shift、pop、push使用实例

    如何声明数组 s中数组的声明可以有几种方式声明 复制代码代码如下: var tmp = [];  // 简写模式var tmp = new Array(); // 直接new一个var tmp = A ...

  3. Android Camera Api的心得

    (一) 前言最近看Camera的api,觉得写的真的不错.现在翻译过来,给大家分享分享,译文可能不太好,大家将就着看哈. (二) 正文1. CameraCamera是Android framework ...

  4. string转化为int方法

    int intA = 0; 1.intA =int.Parse(str); 2.int.TryParse(str, out intA); 3.intA = Convert.ToInt32(str);以 ...

  5. 环境:win7+ie8 IE8的F12不起作用,原因如下:

    1.先按下F12 2.再按下CTL+P,此时调试框将出现在屏幕下方. 3.再次点击CTL+P 4.此时在任务栏上的到IE8的图标,将会看到调试框,右击最大化,此时调试框是最大化状态. 5.然后再慢慢的 ...

  6. [转]iptables

    iptables ptables简介 iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表. filter负责过滤数据包,包括的规则链有,i ...

  7. 使用Metasploit入侵windows之自动扫描

    最新版本的metasploit为4.0,可以通过官方网站(www.metasploit.com)直接下载,因为是开源的,所以免费. metasploit很好很强大,集成了700多种exploit,但是 ...

  8. POJ Sudoku 数独填数 DFS

    题目链接:Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18105   Accepted: 8772   Sp ...

  9. JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)

    第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.col ...

  10. 根据XPATH去查看修改xml文件节点的内容

    首先给出xml文件解析的路径,然后去读取节点的内容. package com.inetpsa.eqc.threads; import java.util.List; import java.io.Fi ...