首页 > 其他分享 >ABC 287 D - Match or Not

ABC 287 D - Match or Not

时间:2024-04-21 19:56:29浏览次数:25  
标签:ABC string int ++ 287 && Match 个字符 size

题目链接:

第一次提交:依据题意直接模拟,喜提 \(\sf TLE\)。
image

#include <bits/stdc++.h>

using namespace std;

bool check(string a, string b) {
	for (int i = 0; i < a.size(); i++) {
		if (a[i] == '?' && b[i] != '?') a[i] = b[i];
		else if (a[i] != '?' && b[i] == '?') b[i] = a[i];
	}
	return (a == b);
}

int main()
{
	string S, T;
	cin >> S >> T;
	int n = T.size();
	for (int i = 0; i <= n; i++) {
		string t;
		string t1 = S.substr(0, i);
		string t2 = S.substr(S.size() + i - n, n - i);
		t = t1 + t2;
		if (check(t, T)) puts("Yes");
		else puts("No");
	}
	return 0;
}

显然时间复杂度是 \(O(n^2)\) 的,数据范围到了 \(10^5\) 肯定会超时。

思考优化:暴力解法是把 \(S'\) 计算出来,加了两个子串后再去遍历判断。考虑单个字符的匹配 如果两个字符 \(a\) 和 \(b\) 至少一个为 \(?\) 或者 \(a=b\),则这两个字符相匹配。

所以我们可以用 \(O(n)\) 预处理出 \(S\) 和 \(T\) 前多少个字符相匹配/后多少个字符相匹配,然后对于每次查询 \(x\),只需看前 \(x\) 个字符和后 \(m-x\) 个字符是否在之前预处理出的字符数范围内即可。\(O(1) \times O(n) = O(n)\)

总时间复杂度为 \(O(n)\)

#include <bits/stdc++.h>

using namespace std;

bool match(char a, char b) {
	return a == '?' || b == '?' || a == b;
}

int main()
{
	string S, T;
	cin >> S >> T;
	int n = S.size(), m = T.size();
	
	int i = 0, j = 0;
	while (i < m && match(S[i], T[i])) i++;//表示S和T的前i个字符都匹配
	while (j < m && match(S[n - 1 - j], T[m - 1 - j])) j++;//表示S和T的后j个字符都匹配
	
	for (int x = 0; x <= m; x++) {
		cout << (x <= i && m - x <= j ? "Yes" : "No") << "\n";
	}
	return 0;
}

标签:ABC,string,int,++,287,&&,Match,个字符,size
From: https://www.cnblogs.com/pangyou3s/p/18149401

相关文章

  • Atcoder ABC 350 全题解
    题外话别以为博主之前几场ABC都咕咕咕了,最近状态不好,这次ABC终于回来了(也有可能是题目变容易了,有图为证)P.S.请耐心看到最后!!否则后果自负!!!AB这年头谁不会AB啊当然有。不学OI的人。C考虑选择排序,依次将$1,2,3\cdots$与它们应该在的位置进行交换。那如果真的......
  • ABC-325
    D题目链接https://atcoder.jp/contests/abc325/tasks/abc325_d题目大意题目思路贪心,每一次优先选取最先出去的,优先队列!题目代码#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intn,ans;intmain(){ cin>>n; vector<array<ll,2>>a(n); for(......
  • ABC 287 B - Postal Card
    题目链接:由于是可以和\(T\)的多个字符串相同而仅计数一次,考虑把\(T\)中的字符串用\(\rmset\)存储已达到去重的目的。注:\(\rmset\)的\(\rmcount\)返回\(1\)表示找到了该元素,返回\(0\)则说明没找到。#include<bits/stdc++.h>usingi64=longlong;intmain......
  • ABC 287 C - Path Graph?
    题目链接:首先根据条件$-对于所有i=1,2,…,N−1,有一条边连接顶点v_i$和\(v_{i+1}\)可以得到,路径图必须有\(N-1\)条边。其次,Ifintegers\(i\)and\(j\)satisfies\(1\leqi,j\leqN\)and\(|i-j|\geq2\),thenthereisnoedgethatconnectsvertices\(......
  • [ABC350] 赛后总结
    [ABC350]赛后总结AK之。A模拟//Problem:A-PastABCs//Contest:AtCoder-AtCoderBeginnerContest350//Author:Moyou//Copyright(c)2024MoyouAllrightsreserved.//Date:2024-04-2020:00:23#include<algorithm>#include<cstring>#incl......
  • ABC 350F
    没有push_down调了15分钟,然后在赛后7分钟过的,中间看到E是期望题就去打舟了,哎,再也不摆了(期望能不能别再出现了)翻转?这我熟,fhq啊!然后大写变小写?简单,再lazytag搞一下就好了。时间复杂度\(O(n\logn)\),带一个大常数,但是绰绰有余。#include<bits/stdc++.h>#definefor1......
  • ABC350题解(E-G)
    E直接搜一下\(N\)的可能到达的值的个数,发现不多(大约\(10^4\)个),直接暴力dp(记忆化搜索)。转移式\(f_i=\max(X\log_{A}N,\dfrac{\sum\limits_{j=1}^6f_{i/j}}{6}+Y)\)。化简得到\(f_i=\max(X\log_{A}N,\dfrac{\left(\sum\limits_{j=2}^6f_{i/j}\right)+6Y}{5})\)。F文艺......
  • ABC 286 C - Rotate and Palindrome
    题目链接:注意到“您可以按任意顺序执行以下两种运算零次或多次”。因此,解决这个问题的一个重要观察点是,你可以假设\(A\)操作执行了几次,然后\(B\)操作执行了几次。你也可以假设\(A\)操作最多被执行\(N\)次(因为执行\(N\)次就会使它处于原始状态)有了这个观察结果,你就......
  • Codeforces 954I Yet Another String Matching Problem
    考虑到这个答案怎么算。能发现相当于是对应的字符间相连边,那么一个连通块中的字符就要变成同一个字符。于是一个连通块的代价就是\(sz-1\)。所以令有\(x\)个连通块,最后的代价就是\(|\Sigma|-x\)。考虑到因为\(|\Sigma|=6\),而\(B_6=203\)(贝尔数,\(B_n\)意义为大......
  • [题解]ABC209F Deforestation
    ABC209FDeforestation首先我们可以思考\(a_i\)和\(a_{i+1}\)先砍哪棵花费少。可以看出,当\(a[i]<a[i+1]\)时,先砍\(a[i+1]\),反之亦然。所以这个题转化成了:给定\(n-1\)个关系,分别表示\(n\)个值中相邻两个的大小关系,问满足这些关系的序列个数。与AtcoderEducationalDPContest......