题意:

思路:论文题

建立Trie树的后缀自动机需要换这个长的板子

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,int>P;
#define N 800010
#define M 8100000
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const int MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=1e9;
ll inf=5e13;
int dx[]={-,,,};
int dy[]={,,-,}; char s[M];
int p,np,q,nq,k,cas,n;
int pos[N]; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} struct sam
{
int cnt;
int fa[N<<],ch[N<<][];
int st[N<<],b[N<<],bl[N<<],to[N<<],size[N<<];
ll f[N<<];
sam()
{
cnt=;
} int add(int p,int x)
{
if(ch[p][x])
{
q=ch[p][x];
if(st[q]==st[p]+)
{
size[q]++;
return q;
}
else
{
st[nq=++cnt]=st[p]+; size[nq]=;
memcpy(ch[nq],ch[q],sizeof ch[q]);
//t[nq]=t[q];
fa[nq]=fa[q];
fa[q]=nq;
while(ch[p][x]==q)
{
ch[p][x]=nq;
p=fa[p];
}
return nq;
}
}
else
{
st[np=++cnt]=st[p]+; size[np]=;
while(p&&!ch[p][x])
{
ch[p][x]=np;
p=fa[p];
}
if(!p) fa[np]=;
else
{
int q=ch[p][x];
if(st[q]==st[p]+) fa[np]=q;
else
{
nq=++cnt; st[nq]=st[p]+;
memcpy(ch[nq],ch[q],sizeof ch[q]);
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
while(ch[p][x]==q)
{
ch[p][x]=nq;
p=fa[p];
}
}
}
}
return np;
} void solve()
{
//printf("cnt=%d\n",cnt);
rep(i,,cnt) b[st[i]]++;
rep(i,,cnt) b[i]+=b[i-];
rep(i,,cnt) bl[b[st[i]]--]=i;
scanf("%s",s+);
int n=strlen(s+);
per(i,cnt,) size[fa[bl[i]]]+=size[bl[i]];
//rep(i,1,cnt) printf("%d\n",size[i]);
size[]=;
rep(i,,cnt)
{
int p=bl[i];
f[p]=f[fa[p]]+1ll*(st[p]-st[fa[p]])*size[p];
}
ll ans=;
p=;
int L=;
rep(i,,n)
{
int x=s[i]-'a';
if(ch[p][x]) L++,p=ch[p][x];
else
{
while(p&&!ch[p][x]) p=fa[p];
if(p) L=st[p]+,p=ch[p][x];
else L=,p=;
}
if(p!=) ans+=f[fa[p]]+1ll*(L-st[fa[p]])*size[p];
}
printf("%lld\n",ans);
} }sam; int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
n=read();
pos[]=;
rep(i,,n)
{
int x=read();
scanf("%s",s+);
pos[i]=sam.add(pos[x],s[]-'a');
}
sam.solve();
return ;
}

【BZOJ3756】Pty的字符串(广义后缀自动机)的更多相关文章

  1. BZOJ 3473: 字符串 [广义后缀自动机]

    3473: 字符串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 354  Solved: 160[Submit][Status][Discuss] ...

  2. 【bzoj3277/bzoj3473】串/字符串 广义后缀自动机

    题目描述 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). 输入 第一行两个整数n,k.接下来n行每行一个 ...

  3. BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)

    标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...

  4. BZOJ3473 字符串 广义后缀自动机

    今天主攻了下SAM 好多东西以前都没理解到 对于这道题 我们建一个自动机存所有串 每个穿last从1开始 对于自动机上每个点额外记一个cnt 表示能匹配到这个点的不同串个数 建完对每个串在自动机上匹配 ...

  5. BZOJ 3473 字符串 ——广义后缀自动机

    这题就比较有趣了. 首先匹配一遍,然后统计子树叶子节点中包含大于等于k的节点个数(HH的项链) 然后就可以搞了. 关于合法的情况数,显然是l[i]-l[fa[i]],然后向下下传即可(YY一下). # ...

  6. bzoj 3277 串 && bzoj 3473 字符串 && bzoj 2780 [Spoj]8093 Sevenk Love Oimaster——广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...

  7. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比 ...

  8. BZOJ3473 字符串 【广义后缀自动机】

    题目 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 输入格式 第一行两个整数n,k. 接下来n行每行一个字符串. 输出格式 一行n个整数,第i个整数表 ...

  9. 2020牛客暑期多校训练营(第四场) C - Count New String (字符串,广义后缀自动机,序列自动机)

    Count New String 题意: 定义字符串函数 \(f(S,x,y)(1\le x\le y\le n)\),返回一个长度为y-x+1的字符串,第 i 位是 \(max_{i=x...x+k ...

  10. BZOJ 3473: 字符串 (广义后缀自动机)

    /* 广义后缀自动机, 每次加入维护 该right集合的set, 然后可以更新所有的parent,最终能够出现在k个串中right集合也就是set大小大于等于k的部分 这样的话就给了我们要跳的节点加了 ...

随机推荐

  1. SqlServer 索引和视图

    Ø 索引 1. 什么是索引 索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度. 2. 索引分类 数据库中索引主要分为两类:聚集索引和非聚集索引.SQL Serv ...

  2. 【ABAP系列】SAP ABAP常用函数总结第一篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP常用函数总结第一 ...

  3. Tomcat各个版本的下载地址包括源码

    Tomcat各个版本的下载地址包括源码: http://archive.apache.org/dist/tomcat **************** 选择版本 **************** ** ...

  4. SQL Server 分页语句查询

    --查询第10页的数据(15条) SELECT TEMP1.* FROM( SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,* FR ...

  5. JavaScript如何获得两点之间顺时针旋转的角度

    接上回:如何用javascript中的canvas让图片自己旋转 既然能够制定角度让图片旋转,那么现在要做的是自动获得旋转的角度, 让图片能够随着鼠标的方向旋转,让人物能够面朝鼠标的方向: 源代码: ...

  6. python字典、字符串(json串)、字节串之间的转化

    字典和json字符串(本质也是字符串)之间的转化用json.dumps和json.loads() json.dumps():   字典→json字符串 json.loads():     json字符 ...

  7. golang的数据类型之浮点类型

    [root@node3 shangxuetang]# cat float.go package main import "fmt" //演示golang中小数类型使用func ma ...

  8. fastJson + lombok + 属性名命名 踩坑点

    JavaBean属性名要求:前两个字母要么都大写,要么都小写 package com.jdyh.worker.project.controller; import com.alibaba.fastjs ...

  9. Redis进行数据同步

    数据库中的数据一般都涉及到需要对数据进行备份的,这样可以保证数据的安全性,并且如果将一个主设备的数据同步到多个从设备上,允许用户访问数据时可以从多个从设备进行读取, 这样还可以缓解主设备的压力,Red ...

  10. 创建配置中心服务端(Spring Cloud Config)

    创建配置中心服务端 创建好项目后添加配置文件内容 server.port=9004 spring.application.name=spring-cloud-config-server-01 #git ...