ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

树状数组+哈希+二分

2021-09-08 17:02:40  阅读:135  来源: 互联网

标签:二分 return r1 r2 树状 int l2 哈希 l1


#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define in __int128_t
#define lowbits(x) x&-x

const int X = 133331;
const int N = 1e5 + 10;
in mod;

string s;
ull f[N], c[N];
int n, m;

inline void add(int x, ull y){for(;x<=n;x+=lowbits(x)) c[x]+=y;}
inline ull ask(int x) {ull sum=0;for(;x;x-=lowbits(x)) sum+=c[x];return sum;}
inline ull get(int l, int r) { return (ask(r) - ask(l-1) + mod);}

void init() {f[0] = 1; for(int i=1;i<N;i++)f[i]=f[i-1]*X;}

bool comp(int l1,int r1,int l2,int r2)  
{
	return (get(l1,r1)*f[l2-l1] == get(l2,r2)); // 略有不同
}

bool dfs(int l1, int r1, int l2, int r2) {
    if (l1 == r1) return true;
    int mid1 = (l1 + r1) >> 1;
    int mid2 = (l2 + r2) >> 1;

    bool f1 = comp(l1, mid1, l2, mid2);
    bool f2 = comp(mid1 + 1, r1, mid2 + 1, r2);
    if (!f1 && !f2) return false;
    if (!f1) return dfs(l1, mid1, l2, mid2);
    else return dfs(mid1 + 1, r1, mid2 + 1, r2);
}

int main()
{
    mod = 1;
    ull a = 2;
    int b = 64;
    while(b)
    {
        if(b&1) mod = a * mod;
        a = a * a;
        b >>= 1;
    }

	init();
	
	cin >> n >> m >> s;
	
	s = " " + s;
	
	for(int i=1; i<=n; i++) add(i,f[i]*s[i]);
	
	bool flag = true;
    
    while(m--)
    {
        int op; 
        cin >> op;
        if(op==1)
        { 
            int pos;
            char tmp; 
            cin >> pos >> tmp;
            ull p = (tmp - s[pos] + mod);
            add(pos, p*f[pos]);
            s[pos] = tmp;
        }
        else
        {
            bool f = false;
            int l1, r1, l2, r2;
            cin >> l1 >> r1 >> l2 >> r2;
            if(abs(r1-l1) != abs(r2-l2)) goto gotoflag;
            if(l1 > l2) swap(l1,l2), swap(r1,r2);
        	if(comp(l1,r1,l2,r2)) { 
                f = true;goto gotoflag;
            }
            if (dfs(l1, r1, l2, r2)) f = true;
            
        gotoflag:   
            
            if(f) cout << "YES\n";
            else cout << "NO\n";
        } 
        
    }
	
	return 0;
}

标签:二分,return,r1,r2,树状,int,l2,哈希,l1
来源: https://blog.csdn.net/luker6/article/details/120184021

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有