Kefa and Watch
一道紫色的大水题。
正解线段树维护哈希值,但是对于不会的人来说,暴力也可行!
具体地,STL 大法。使用 vector<char>
存储原数组(string
也可以)。对于操作 1
,直接用 std::fill
进行区间赋值;对于操作 2
,用 std::equal
判断 个区间是否相等。
操作 1
,2
都是 的,时间复杂度如此炸裂,为什么还能通过呢?
在古老的 C 语言中有一些库函数,专门处理内存的相关操作,例如 memset
、memcpy
、memcmp
等。它们都在汇编层面进行过优化,虽然时间复杂度还是 ,但是常数被优化到极小。在 C++ 中,它们被对迭代器更友好的相关函数替代,但是在许多情况下仍会被编译器优化。因此,这些 STL 函数的常数较小,再加上数据较水,可以通过本题。
#include<bits/extc++.h>
using namespace std;
namespace pbds=__gnu_pbds;
using ui=unsigned int;
using uli=unsigned long long int;
using li=long long int;
int main(void){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
size_t n,m,k;
cin>>n>>m>>k;
vector<char> s(n);
for (char& i:s) cin>>i;
for (size_t i=0;i<m+k;++i){
char op;size_t l,r;
cin>>op>>l>>r;--l;
if (op=='1'){
char c;
cin>>c;
fill(s.begin()+l,s.begin()+r,c);
}else{
size_t d;
cin>>d;
cout<<(equal(s.begin()+l,s.begin()+r-d,s.begin()+l+d)?"YES\n":"NO\n");
}
}
return 0;
}