Kefa and Watch

一道紫色的大水题。

正解线段树维护哈希值,但是对于不会的人来说,暴力也可行!

具体地,STL 大法。使用 vector<char> 存储原数组(string 也可以)。对于操作 1,直接用 std::fill 进行区间赋值;对于操作 2,用 std::equal 判断 个区间是否相等。

操作 12 都是 的,时间复杂度如此炸裂,为什么还能通过呢?

在古老的 C 语言中有一些库函数,专门处理内存的相关操作,例如 memsetmemcpymemcmp 等。它们都在汇编层面进行过优化,虽然时间复杂度还是 ,但是常数被优化到极小。在 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;
}
posted @ 2023-09-17 16:53  MrPython  阅读(5)  评论(0)    收藏  举报  来源