首页 > 其他分享 >[ABC287D] Match or Not 题解

[ABC287D] Match or Not 题解

时间:2023-05-25 22:01:59浏览次数:46  
标签:pre suf ch 匹配 int 题解 ABC287D Match define

Description

翻译给的很明白了,就是让你判断 \(S\) 串的前 \(x(0 \leq x \leq |T|)\) 个字符和后 \(|T|-x\) 个字符组成的字符串和 \(T\) 串是否相等,其中问号能代替所有字母。

Solution

很有意思的一道题。

首先我们可以知道,如果前 \(i-1\) 位不能匹配的话,那么第 \(i\) 位不管它本身成功匹配与否,整个串是不匹配的。因此,我们可以很自然地想到递推求解(也可以说是前缀和)。

我们设 \(pre_i\) 表示 \(S\) 串的前 \(i\) 位是否和 \(T\) 串匹配,设 \(suf_i\) 表示 \(S\) 串的 \(i-|S|\) 位是否和 \(T\) 串匹配。等到最后统计答案的时候就判断 \(pre_i\) 和 \(suf_{|S|-|T|+i+1}\) 是否都能成功匹配即可。

初始值 \(pre_0=1\) ,\(suf_{|S|+1}=1\) 。

接下来考虑怎么求出 \(pre\) 数组,其实也很简单:

  • 如果 \(pre_{i-1} = 0\) ,那么显然 \(pre_i = 0\) ( \(0\) 表示匹配不成功, \(1\) 表示匹配成功);

  • 如果等于 \(1\) ,我们需要判断这一位能不能匹配,有两种可能:

    (1):这一位字母本身就是相等的;

    (2):这两个字母中至少有一个问号。

    满足这两个条件,这一位就是匹配的了。

通过这个我们就可以求解这个问题了,\(suf\) 数组也是同理,只不过是反过来了。

Code

#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define next nxt
#define re register
#define il inline
const int N = 3e5 + 5;
using namespace std;
int max(int x,int y){return x > y ? x : y;}
int min(int x,int y){return x < y ? x : y;}

char s[N],t[N];
int n,m,pre[N],suf[N];

il int read()
{
	int f=0,s=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f |= (ch=='-');
	for(; isdigit(ch);ch=getchar()) s = (s<<1) + (s<<3) + (ch^48);
	return f ? -s : s;
}

signed main()
{
	cin >> s+1 >> t+1;
	pre[0] = 1;
	n = strlen(s+1) , m = strlen(t+1);
	for(re int i=1;i<=m;i++) if((s[i] == t[i] || (s[i] == '?' || t[i] == '?')) && pre[i-1]) pre[i] = 1; else pre[i] = 0;
	suf[n+1] = 1;
	for(re int i=n,j=m;i>=n-m+1;i--,j--) if((s[i] == t[j] || (s[i] == '?' || t[j] == '?')) && suf[i+1]) suf[i] = 1; else suf[i] = 0;
	for(re int i=0;i<=m;i++) if(pre[i] == 1 && suf[n-m+i+1] == 1) puts("Yes"); else puts("No");
	return 0;
}

标签:pre,suf,ch,匹配,int,题解,ABC287D,Match,define
From: https://www.cnblogs.com/bloodstalk/p/17433088.html

相关文章

  • P5446 [THUPC2018]绿绿和串串 题解
    Description给定一个串\(S\),要求串\(S\)是串\(R\)经过多次翻转后的前缀。问有多少种初始长度的串\(R\)。串\(R\)翻转的定义是将前\(|R|-1\)个字符倒序排列后,插入到串的最后。如\(\mathrm{aaa}\)翻转后得到\(\mathrm{abcdcba}\)。Solution我们先设以\(i\)为......
  • CF1139E Maximize Mex 题解
    Description\(n\)个学生,\(m\)个社团。每个学生有一个能力值,且仅属于一个社团。这\(d\)天内,每天从\(m\)个社团中选人,使得选出的人的能力值的\(\text{mex}\)最大。每天会有一个人在选人之前退团。\(d,m\leqn\leq5000\)Solution巧妙建图题。首先,我们可以很显然的......
  • P8081 [COCI2011-2012#4] ZIMA 题解
    题意给定一个长度为\(n\)的序列。当连续\(T\)天温度都小于\(0\)时,则称这\(T\)天为一个冰期,冰期来临之前的\(2T\)天都被标记为警示状态.特殊地,如果一个冰期最长,那么它的前\(3T\)天会被标记为警示状态。如果有多个冰期最长,选一个。思路模拟预处理出每个冰期的长......
  • AT2395 [ARC071C] TrBBnsformBBtion 题解
    题目大意有两个只包含\(A\)和\(B\)的字符串,给出两种操作A可以变为BB,B可以变为A;AAA可以消去,BBB也可以消去。思路找规律。这里我们以A为主,将B全部变为A。因为可以无限次操作,那么就代表如果两个字符串可以相等,那么他们就一定能够经过转化后变成同一个字......
  • CF714B Filya and Homework 题解
    题意给定一个长度为\(n\)的数组。我们可以给一些数加上一个\(x\),也可以减去一个\(x\),也可以不加也不减。问:是否存在一个数\(x\),使得这个数组里各个数都相等。思路一道思维题首先考虑,在这个数组中,相同的元素,我们一定是给它做相同的操作,否则一定不相等,根据这个思想,......
  • UVA1514 Piece it together 题解
    图论题还是在于建图题意给定一个长度为\(n\timesm\)的网格图,有的地方是白方块,有的是黑方块,有的啥也没用。给你如下四种\(L\)形方块,询问是否存在方法,让这些方块正好就是给出的图的形状。$L$形方块如下思路二分图首先我们要想,为什么需要二分图:若能拼成,那么就说......
  • SP15637 Mr Youngs Picture Permutations 题解
    题意给定一个最多有\(5\)排的一个队伍,每一个位置对应一个同学,给定总人数和第\(i\)排要站\(n_i\)个人。要求每行左边的同学身高要大于右边的,每列从上往下要从大到小。问:满足要求的一共有多少种方案。思路DP首先考虑,在这个题目中,有用的状态有每列最后的人的高度,每行......
  • P8584 探索未知 题解
    题意给你\(n\)个分数,每个分数后面跟着一个操作符\(op\),如果为\(1\)就是加上这个分数,是\(2\)就减去。初始时是\(0\),询问\(n\)次操作后最后的分数是多少,化成最简分数。特殊地,如果最后是个整数,直接以整数的形式输出。思路模拟考试的时候一看就想到了[NOIP2020]......
  • P8587 新的家乡 题解
    题意给定\(n\)个高度分别为\(h_i\)的柱子,两个柱子能合并成一个\(h_i+h_j\)的新柱子,每根柱子至多被使用一次。询问最多能建出多少根高度相同的柱子,并且最优答案下柱子的高度有多少种情况。\(1\leqn\leq10^6\),\(1\leqh_i\leq3\times10^3\)。思路爆搜!首先我们......
  • P8585 球状精灵的传说 题解
    很好的一个题题意给你\(n\)个三元组\((r_1,r_2,r_3)\),并定义\(ρ=\lfloor\frac{1}{4}min(r_1,r_2,r_3)^3\rfloor\)。两个三元组能合并当且仅当这两个三元组有至少两个值相同,即从\((x_1,y,z)\)和\((x_2,y,z)\)变为\((x_1+x_2,y,z)\)。\((x,y,z)\)的位置不固定......