Non-Substring Subsequence

Non-Substring Subsequence

原题链接:传送门


人一我十, 人十我百,追逐青春的梦想,怀着自信的心,永不言弃!


题目大意

给定我们一个长度为 (n)的二进制字符串,和 (q) 次查询,每次查询将给出我们一个区间([l , r]) , 我们需要检查在 s 中是否存在一个子序列 和 子段 (s[l , r]),如果存在则输出YES , 否则输出 NO

分析

这题我吐了,其实解法很简单,仅仅只是让我们判断一个子序列是否存在,那么我们只需要在(s[0,l-1]) 区间内查看是否存在一个字符和 (s[l]),相等,如果左边不存在那么再检查右边检查从 (s[r + 1 , n]) 中是否存在一个字符和 (s[r]) 相等即可,如果两个条件都不满足则一定不可以构造出来,如果满足任意一个则可以输出YES.可以证明此方法为条件成立的充分必要条件,但过于简单在此忽略证明过程

我当时脑子抽风了,愣是把那么要求子序列不连续,且子序列的总长度 (>= 2),翻译成了要求子序列不连续的长度为不能超过 2,愣是给这题增加了数倍的难度。结果最后发现自己是个hp。

来自学妹的嘲讽QAQ:

本来应该是一场上分场,又由于自己的翻译失误,导致打崩了,希望下次自己再细心一点,再认真一点,下一场加油!

AC 代码

AC code

#include <bits/stdc++.h>

#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define lowbit(x) (x & -x)
#define FOR(i,a,b)  for(int i=(a); i< (b); ++i)
#define RFOR(i,b,a) for(int i=(b);i>=(a);i--)
#define REP(i,a,b)  for(int i=(a); i<=(b); ++i)

#define PI 3.14159265358979323846264338327950L
#define PB push_back
#include <bits/stdc++.h>

#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define lowbit(x) (x & -x)
#define FOR(i,a,b)  for(int i=(a); i< (b); ++i)
#define RFOR(i,b,a) for(int i=(b);i>=(a);i--)
#define REP(i,a,b)  for(int i=(a); i<=(b); ++i)

#define PI 3.14159265358979323846264338327950L
#define PB push_back

using namespace std;
typedef long long ll;
template<typename T>
void PrArr(const T a[] , int len){
	for(int i = 0; i <= len; i++)cout << a[i] << " ";
	cout << endl;
}
template<typename T>
void PrVec(const vector<T> a){
	for(auto it : a)cout << it << " ";
	cout << endl;
}
template<class T>inline void read(T &res)
{
	char c;T flag=1;
	while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
	while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}

const int MAX = 0x7ffffff;
const int MIN = 0xcf;
int test;
int n , q;string s;
void func(int l, int r)
{
	bool bad = false;
	for(int i = 0; i < l; i ++)
		if(s[i] == s[l])bad = true;
	for(int j = r + 1; j < s.size(); j ++)
		if(s[j] == s[r])bad = true;
	cout << (bad ? "YES" : "NO") << endl;
}
void slove()
{
	cin >> n >> q >> s;
	for(int i = 0; i < q; i ++)
	{
		int l, r;
		cin >> l >> r;
		l--, r--;
		func(l , r);
	}
}
int main()
{
#ifdef LOCAL
	auto start_time = clock();
	cerr << setprecision(3) << fixed; // 在iomanip中
#endif
	SIS;cin >> test;
	while(test--)slove();
#ifdef LOCAL
	auto end_time = clock();
	cerr << "Execution time: " << (end_time - start_time) * (int)1e3 / CLOCKS_PER_SEC << " ms
";
#endif
}

原文地址:https://www.cnblogs.com/wlw-x/p/14018256.html