首页 > 其他分享 >基因改造 题解

基因改造 题解

时间:2024-07-23 20:30:36浏览次数:7  
标签:位置 匹配 int 题解 texttt 基因 ++ 改造 fail

前言

题目链接:Hydro & bzoj

题意简述

求匹配串 \(S\) 中和模式串 \(T\) 匹配的子串。两个串被定义为匹配的,当且仅当一个串任意交换字符后和另一个串相等。例如 \(\texttt{12321}\) 和 \(\texttt{21312}\) 匹配,因为前者交换 \(\texttt{1}\) 和 \(\texttt{2}\) 后与后者等价。当然,可以和一个串中不出现的字符交换。

题目分析

如果直接求匹配很板子,但是题目重新定义了匹配,所以考虑把这个匹配转换成我们熟悉的形式。

敏锐地发现,两个串匹配,当且仅当存在一个映射,把一个串通过这个映射变换后和另一个串相等。

进一步发现,和每一种字符的相对位置有关。考虑对于一个串的每一个位置,处理出该位置和上一次出现这个值的位置之差,作为该位置新的关键值用于比较。特殊地,如果从来没有出现,记上一次出现的位置为 \(0\)。

对于匹配串和模式串,我们都可以预处理出这样一个数组,匹配的时候拿这两个数组匹配即可。当然,如果在匹配串中某一个位置,其关键值大于了当前匹配到的长度,则当做没有出现过处理即可。

这么做的正确性是显然的。

代码

void solve() {
	read(n), read(m), memset(idx, 0x00, sizeof (int) * (V + 1));
	for (int i = 1, x; i <= n; ++i) read(x), S[i] = i - idx[x], idx[x] = i;
	memset(idx, 0x00, sizeof (int) * (V + 1));
	for (int i = 1, x; i <= m; ++i) read(x), T[i] = i - idx[x], idx[x] = i;
	tot = 0, T[m + 1] = S[n + 1] = 0;
	for (int i = 1, j = fail[0] = -1; i <= m; ++i) {
		while (~j && !(T[i] == T[j + 1] || (T[i] > j && T[j + 1] > j))) j = fail[j];
		fail[i] = ++j;
	}
	for (int i = 1, j = 0; i <= n; ++i) {
		while (~j && !(S[i] == T[j + 1] || (S[i] > j && T[j + 1] > j))) j = fail[j];
		++j;
		if (j == m) ans[++tot] = i - j + 1;
	}
	write(tot), putchar('\n');
	for (int i = 1; i <= tot; ++i) write(ans[i]), putchar(' ');
	putchar('\n');
}

标签:位置,匹配,int,题解,texttt,基因,++,改造,fail
From: https://www.cnblogs.com/XuYueming/p/18319562

相关文章

  • oss模块设计之适配器模式改造minio
    在进行本节的笔记之前,我们先进行对oss服务与minio做一个简单介绍,方便大家更便于理解;OSS服务(ObjectStorageService)OSS服务,即对象存储服务,是一种用于云端的大规模、高可用、安全、低成本的数据存储服务。它主要用于存储非结构化的数据,如图片、音频、视频、文档等文件。OSS服务具......
  • CF521E Cycling City 题解
    Description给定一张\(n\)个点\(m\)条边的无向简单图。问图中能否找到两个点,满足这两个点之间有至少三条完全不相交的简单路径。\(n,m\le2\times10^5\),图不保证连通。Solution容易发现有解地充要条件是存在两个环有边交,考虑在dfs树上做这件事。注意到非树边一定......
  • CF1990F Polygonal Segments 题解
    题目链接:https://codeforces.com/contest/1990/problem/F赛时想到了一个略显抽象的做法,但因为写反了一个判断导致没能过掉。赛后调参卡过,用时\(3.5/8\)秒。为了不丢失这个idea最终还是决定写个题解记录一下。题意简述给定一个数组\(a_{1..n}\),执行以下查询:查询区间\([......
  • 宿舍智能控电限电系统的安装改造
    宿舍智能控电限电系统的安装改造石家庄光大远通电气有限公司产品使用功能:预收费功能:用户应先到学校购电处购电,售电计算机将在十秒钟内自动将数据发送到控电柜各个用电单元,然后系统会给用户供电,当用户剩余电量为零时,系统可自动切断该单元供电,只有当用户重新购电后,系统才会......
  • 题解:P10800 「CZOI-R1」卡牌
    \(\text{Link}\)最近做的最神金的一道数据结构题。题意给出\(m\)个值域为\([1,n]\)的四元组\(t_{i,0\sim3}\),定义四元组\(A\)胜于四元组\(B\)当且仅当最多存在一个\(j\in[0,3]\)使得\(A_j\leB_j\),求出有多少个值域为\([1,n]\)的四元组\(A\)胜于所有的\(t_{1......
  • 题解:P10717「KDOI-05」简单的树上问题
    \(\text{Link}\)题意给你一颗\(n\)个结点的树,有\(k\)次操作,第\(i\)次操作:每个点初始都处于未激活状态;以\(p_{i,j}\)的概率激活点\(j\);对于每个未激活的点\(i\),如果存在激活的结点\(j,k\)且\(i\)在\(j\)到\(k\)的路径上,则\(i\)也会被激活。给出\(v_{i......
  • NOI2024 题解
    D2T3树形图首先判掉一些case将任意一个\(1\)类点定为根,求出一棵dfs树,则图上的非树边只有返祖边,没有横叉边。\(1\)类点考虑在这棵dfs树的基础上求出所有\(1\)类点:考虑\(fa_u\tou\)这条边被几条返祖边覆盖了,由于这是一个强连通分量,所以子树中至少有一条返祖边覆......
  • 题解:CF1992F Valuable Cards
    Part1:前言题目翻译在他最喜欢的咖啡馆里,Kmes再次想尝尝皮草大衣下的鲱鱼。以前,这对他来说并不难,但咖啡馆最近推出了一项新的购买政策。现在,为了进行购买,Kmes需要解决以下问题:在他面前摆放着\(n\)张不同价格的卡,第\(i\)张卡的价格为\(a_i\),在这些价格中没有整数\(x\)。K......
  • 题解:P9437 一棵树
    题目传送门明显的换根dp,感觉是道不错的换根dp练习题。题意一棵\(n\)个节点的树,点带权,定义\(w(x,y)=\overline{a_x\dotsa_y}\)。求\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}w(i,j)\bmod998244353\)。思路我们不妨先求出\(i=1\)时的\(\sumw(i,j)\),再求\(......
  • [SDOI2012] 走迷宫 题解
    [SDOI2012]走迷宫题目描述Morenan被困在了一个迷宫里。迷宫可以视为\(n\)个点\(m\)条边的有向图,其中Morenan处于起点\(s\),迷宫的终点设为\(t\)。可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的有向边,到达另一个点。这样,Morenan走的步数可能......