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\n";
#endif
}