首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HDU 4416 后缀自动机

HDU 4416 后缀自动机

作者头像
用户2965768
发布于 2019-08-01 03:05:26
发布于 2019-08-01 03:05:26
28000
代码可运行
举报
文章被收录于专栏:wymwym
运行总次数:0
代码可运行

题意:多组样例t,每个样例一个数n,接下来一个字符串 T ,n个字符串S,问T的子串有多少没有在S中出现

解:先将n个字符串加入后缀自动机,统计子串个数 ans,再把T加入后缀自动机,统计字符串个数ans2,

ans2 - ans1 就是答案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <bits/stdc++.h>
#define ll long long
const int maxn = 1000008;
const int maxc = 28;
using namespace std;
struct Suffix_Automaton {
	int len[maxn * 2], //最长子串的长度(该节点子串数量=len[x]-len[link[x]])
	    link[maxn * 2],   //后缀链接(最短串前部减少一个字符所到达的状态)
	    nex[maxn * 2][maxc],  //状态转移(尾部加一个字符的下一个状态)(图)
	    idx, //结点编号
	    last;    //最后结点


	void init() {	//初始化
	for(int i=1;i<=idx;i++)
		link[i] = len[i] = 0,memset(nex[i],0,sizeof(nex[i]));
		last = idx = 1; //1表示root起始点 空集
	}
//SAM建图
	void extend(int c) {     //插入字符,为字符ascll码值
		int x = ++idx; //创建一个新结点x;
		len[x] = len[last] + 1; //  长度等于最后一个结点+1
		//num[x] = 1;  //接受结点子串除后缀连接还需加一
		int p;  //第一个有C转移的结点;
		for (p = last; p && !nex[p][c]; p = link[p])
			nex[p][c] = x;//沿着后缀连接 将所有没有字符c转移的节点直接指向新结点
		if (!p)link[x] = 1;
		else {
			int q = nex[p][c];    //p通过c转移到的结点
			if (len[p] + 1 == len[q])    //pq是连续的
				link[x] = q;
			else {
				int nq = ++idx;   //不连续 需要复制一份q结点
				len[nq] = len[p] + 1;   //令nq与p连续
				link[nq] = link[q];   //因后面link[q]改变此处不加cnt
				memcpy(nex[nq], nex[q], sizeof(nex[q]));  //复制q的信息给nq
				for (; p&&nex[p][c] == q; p = link[p])
					nex[p][c] = nq;    //沿着后缀连接 将所有通过c转移为q的改为nq
				link[q] = link[x] = nq; //将x和q后缀连接改为nq
			
			}
		}
		last = x;  //更新最后处理的结点
	} 

	ll getSubNum() {	//求不相同子串数量
		ll ans = 0;
		for (int i = 2; i <= idx; i++)ans += len[i] - len[link[i]];	//一状态子串数量等于len[i]-len[link[i]]
		return ans;
	} 

} sam;
string str1,str2;
int main()
{
	cin.sync_with_stdio(0);
	int T,n,lenn; 
	int ccnt = 1;
	cin>>T;
	while(T--)
	{
		sam.init();
		cin>>n;
		cin>>str1;
		for(int i=1;i<=n;i++){
			sam.last = 1;
			cin>>str2; lenn = str2.size();
			for(int j=0;j<lenn;j++){
				sam.extend(str2[j]-'a');
			}
		}
		ll ans = sam.getSubNum();	
		sam.last = 1;
		lenn = str1.size();
		for(int i=0;i<lenn;i++){
			sam.extend(str1[i]-'a');
		}
		ans = sam.getSubNum() - ans;
		printf("Case %d: %lld\n",ccnt++,ans);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年07月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2019 牛客多校 第四场 I、string 广义后缀自动机 + 回文树
题意:求string串有多少个本质不同的子串,且这些子串之间两两不存在 a==rev(a),及不存在长度1以上的回文串
用户2965768
2019/08/01
5040
洛谷P3804 【模板】后缀自动机
题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值。 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS 输出格式: 一个整数,为 所求答案 输入输出样例 输入样例#1: 复制 abab 输出样例#1: 复制 4 说明 对于 10\%10% 的数据, |S|<=1000∣S∣<=1000 对于 100\%100% 的数据, |S|<=10^6∣S∣<=106 看了一天的后缀自动机,也算是入了一下门 感觉后缀自动
attack
2018/07/04
3940
看完这篇,你一定会感慨“后缀自动机,就这?”
后缀自动机 (suffix automaton, SAM) 是一个能解决许多字符串相关问题的有力的数据结构。
ACM算法日常
2021/09/07
1.2K0
BZOJ3277: 串(广义后缀自动机)
字符串是oi界常考的问题。现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中
attack
2018/07/27
4850
HDU 6138 Fleet of the Eternal Throne(后缀自动机)
我们考虑暴力枚举每个串的前缀,看他能在\(x, y\)的后缀自动机中走多少步,对两者取个min即可
attack
2019/03/06
4230
HDU 6138 Fleet of the Eternal Throne(后缀自动机)
史上全网最清晰后缀自动机学习(四)后缀自动机里的DAG结构
通过【1】、【2】、【3】, 我们学习了后缀自动机这种精巧的数据结构. 它本质上是利用了根据endpos对所有子串的等价类划分这一优美的结构. 【1】我们学习了SAM的基本概念, 【2】我们学习了SAM的O(n) 构造算法. 【3】我们学习了SAM上类似于ac自动机のfail树的一种数据结构——slink树. 本文继续膜SAM. hihocoder #1457 : 后缀自动机四·重复旋律7
ACM算法日常
2019/12/20
8310
cf666E. Forensic Examination(广义后缀自动机 线段树合并)
考虑把询问离线,然后把\(S\)拿到自动机上跑,同时维护一下最长能匹配的位置,对于每个以\(i\)位置为右端点的询问我们需要找到\(len\)最小的状态满足\(len[sta] >= pr - pl + 1\)(这部分把每个以\(i\)为端点的询问排序后暴力跳即可,复杂度\(O(n \sqrt{n})\))。那么现在的问题就是对于每个状态,如何知道他在每个\(T_i\)中的出现次数。
attack
2019/03/14
6480
史上全网最清晰后缀自动机学习(二)后缀自动机的线性时间构造算法
上一篇【1】我们学习了SAM的基本概念. 通过转移函数知道了SAM的工作原理.现在来进一步做题. hihocoder #1445 : 后缀自动机二·重复旋律5 , 注意, 为保证循序渐进, 墙裂推荐先学习【1】再来看本文. 会发现本文是那么的自然.
ACM算法日常
2019/12/12
4970
史上全网最清晰后缀自动机学习(二)后缀自动机的线性时间构造算法
SP8093 JZPGYZ - Sevenk Love Oimaster(广义后缀自动机)
题意 题目链接 Sol 广义后缀自动机板子题。。和BZOJ串那个题很像 首先建出询问串的SAM,然后统计一下每个节点被多少个串包含 最后直接拿询问串上去跑就行了 #include<bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 10; int N, Q; string s[MAXN], t[MAXN]; int fa[MAXN], len[MAXN], ch[MAXN][26], tim[MAXN], val[MAXN], root =
attack
2019/03/14
4270
史上全网最清晰后缀自动机学习(三)后缀自动机里的树结构
【1】+【2】我们已经入门了后缀自动机, 并且给出了后缀自动机 O(n) 的构造算法. 现在继续前行. hihocoder #1449 : 后缀自动机三·重复旋律6
ACM算法日常
2019/12/23
1.2K0
史上全网最清晰后缀自动机学习(三)后缀自动机里的树结构
学会 SAM,做完这几道题目就足够了
上周我们讲解了 sam 的基本原理,这一周,我们将把目光转向他的应用,主要通过题目讲解。
ACM算法日常
2021/09/07
4740
后缀自动机模版
struct Suffix_Automaton { int nex[maxn << 1][26], a[maxn << 1], link[maxn << 1]; int tot, last, root; int p, q, np, nq; int newnode(int len) { for (int i = 0; i < 26; ++i) nex[tot][i] = -1; link[tot] = -1; a[tot] = len;
用户2965768
2019/08/01
3670
回文自动机、AC自动机和后缀自动机介绍(1)
 我们还从一个非常经典的题目出发,最长公共子串问题。给定两个字符串S和T,求S和T的最长公共子串的长度。比如abcdefg和abacabca的最长公共子串是abc  这是一道经典的动态规划问题,大致思路就是用fi表示同时以S[i]和T[j]结尾的最长公共子串的长度。下面看伪代码:
mathor
2018/07/24
1.1K0
回文自动机、AC自动机和后缀自动机介绍(1)
洛谷P3346 [ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
因为所有合法的答案一定是某个叶子节点为根的树上的一条链,因此这样可以统计出所有合法的答案
attack
2019/03/14
4620
史上全网最清晰后缀自动机学习(一)基本概念入门
该拔掉的毒瘤总归得拔掉. SAM(suffix auto mation 后缀自动机)大叔, 来吧!hihocoder 1441 : 后缀自动机一·基本概念
ACM算法日常
2019/12/12
9000
史上全网最清晰后缀自动机学习(一)基本概念入门
后缀自动机经典操作
看了几天的后缀自动机,感觉这玩意儿确实比较神奇。但是感觉自己肯定讲不明白,就简单的来写写心得和应用吧 性质 1、每个状态$s$代表的长度区间为$(len[fa[s]],len[s])$ 也就是说$min(s) = max(s) + 1$ 2、每个状态$s$代表的所有串在原串中的出现次数及出现位置右端点相同。 这也是后缀自动机能够压缩状态的原因,就是把很多相同的串压缩到一个节点中 3、在parent树中,对于状态$s$,$fa[s]$所代表的状态是$s$所代表状态的后缀 4、在parent树中,每个状态的$r
attack
2018/07/04
8440
SPOJ1811 LCS - Longest Common Substring(后缀自动机)
A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string. Now your task is simp
attack
2018/07/04
3160
YbtOJ 544「后缀自动机」子串选取
你可以从左到右依次 选出 若干个 无交 子串 t_1,t_2,\cdots,t_m,要求每次选出的字符串 t_i 必须是前一个字符串 t_{i-1} 的 真子串(即 t_i 是 t_{i-1} 的子串且 t_i 的长度比 t_{i-1} 小)。
yzxoi
2022/09/19
3080
史上全网最清晰后缀自动机学习(五)后缀自动机和最长公共子串问题
最长公共子串(LCS)问题可谓是经典的问题了. 我们使用过DP、后缀树、后缀数组来解决过. 现在我们考虑后缀自动机和LCS问题的联系, 并且来看这一联系的典型例题—— hihocoder #1465 : 后缀自动机五·重复旋律8
ACM算法日常
2020/01/15
1.3K0
史上全网最清晰后缀自动机学习(六)后缀自动机杂题
后缀自动机系列最后一发——后缀自动机和博弈的小综合~ hihocoder #1466 : 后缀自动机六·重复旋律9
ACM算法日常
2020/02/17
5650
史上全网最清晰后缀自动机学习(六)后缀自动机杂题
推荐阅读
相关推荐
2019 牛客多校 第四场 I、string 广义后缀自动机 + 回文树
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档