首页 > 其他分享 >hash

hash

时间:2024-06-30 17:21:54浏览次数:22  
标签:hash r1 int continue st0 st1 ans

#include<bits/stdc++.h> 
using namespace std;
#define int long long
#define all(a) (a).begin(), (a).end()
typedef __int128_t i128;
typedef __uint128_t u128;
const int N = 1e5+7;
vector<int> c[200];
vector<int> d[200];
u128 h[26][N];
u128 p[N];
signed main()
{
    freopen("test.in","r",stdin);
    freopen("test.res","w",stdout);

    int n,m;
    string s;
    cin>>n>>m>>s;
    for(int i=0;i<n;i++)
        c[s[i]].push_back(i);
    for(int i='a';i<='z';i++)
    {
        d[i].push_back(-1);
        d[i].push_back(-1);
        int t = c[i].size();
        for(int j=1;j<c[i].size();j++)
            d[i].push_back(c[i][j]-c[i][j-1]);
        h[i-'a'][0] = 1;
        p[0] = 1;
        for(int j=1;j<=t;j++)
        {
            h[i-'a'][j] = h[i-'a'][j]*13331+d[i][j];
            p[i] = p[i-1]*13331;
        }
    }
    auto get = [&] (u128 i,u128 l,u128 r) -> u128
    {
        return h[i-'a'][r]-h[i-'a'][l-1]*p[r-l+1];
    };

    for(int i=0;i<m;i++)
    {
        int l1,r1,l2,r2;
        cin>>l1>>r1>>l2>>r2;
        l1--;
        l2--;
        r1--;
        r2--;
        set<char> ans;
        for(char j='a';j<='z';j++)   
        {
            int k = 0;
            int st0 = lower_bound(all(c[j]),l1) - c[j].begin();
            int st1 = lower_bound(all(c[j]),l2) - c[j].begin();
            if((st0>=c[j].size()||c[j][st0]>r1)&&(st1>=c[j].size()||c[j][st1]>r2))
                continue;
            if((st0>=c[j].size()||c[j][st0]>r1)||(st1>=c[j].size()||c[j][st1]>r2))
            {
                ans.insert(j);
                continue;
            }
            if(c[j][st0]-l1!=c[j][st1]-l2)
            {
                ans.insert(j);
                continue;
            }
            int ed0 = upper_bound(all(c[j]),r1) - c[j].begin();
            int ed1 = upper_bound(all(c[j]),r2) - c[j].begin();
            if(ed0-st0!=ed1-st1)
            {
                ans.insert(j);
                continue;
            }
            if(ed0-st0==1)  continue;
            if(get(j,st0+1,ed0)!=get(j,st1+1,ed1))
            {
                ans.insert(j);
                continue;
            }
        }
        cout<<ans.size()<<"\n";
        for(auto c:ans)
            cout<<c;
        cout<<"\n";
    }

}

标签:hash,r1,int,continue,st0,st1,ans
From: https://www.cnblogs.com/holycrap/p/18276669

相关文章

  • [Java并发]ConcurrentHashMap
    ConcurrentHashMapHashMap和ConcurrentHashMap的区别主要区别就是hashmap线程不安全,ConcurrentHashMap线程安全HashMap线程不安全,有以下两个问题put覆盖问题比如有两个线程A和B,首先A希望插入一个key-value对到HashMap中,首先计算记录所要落到的桶的索引坐标,然后获取到该桶......
  • Map集合之HashMap细说
            最近在看面试题,看到了hashmap相关的知识,面试中问的也挺多的,然后我这里记录下来,供大家学习。Hashmap为什么线程不安全jdk1.7中,在扩容的时候因为使用头插法导致链表需要倒转,从而可能出现循环链表问题或者数据丢失的问题jdk1.8中,在put方法中,假设A,B两个线......
  • Java 面试题:如何保证集合是线程安全的? ConcurrentHashMap 如何实现高效地线程安全?
    在多线程编程中,保证集合的线程安全是一个常见而又重要的问题。线程安全意味着多个线程可以同时访问集合而不会导致数据不一致或程序崩溃。在Java中,确保集合线程安全的方法有多种,包括使用同步包装类、锁机制以及并发集合类。最简单的方法是使用Collections.synchronized......
  • ConcurrentHashMap(并发工具类)
    并发工具类在JDK的并发包里提供了几个非常有用的并发容器和并发工具类。供我们在多线程开发中进行使用。5.1ConcurrentHashMap5.1.1概述以及基本使用在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我......
  • [字符串专题] KMP、Hash、Trie
    KMP核心思想:在每次失配时,不是把p串往后移一位,而是把p串往后移动至下一次可以和前面部分匹配的位置,这样就可以跳过大多数的失配步骤。而每次p串移动的步数就是通过查找next数组确定的。KMP主要分两步:求next数组、匹配字符串,其难点在于如何求next数组for(inti=1,......
  • hashlib加密模块
    hashlib加密模块importhashlibmd5=hashlib.md5("你好".encode("utf-8"))#实例化把类的功能赋值给变量print(md5.hexdigest())md5.update('世界'.encode("utf-8"))print(md5.hexdigest(),len(md5.hexdigest()))sha256算法h=hashlib.sha256(......
  • HMAC与Hash算法——C语言实现
    hash算法是HMac的Mac hmacsha256.h1/**2*@filehmacsha256.h3*@authoryourname(you@domain.com)4*@brief5*@version0.16*@date2024-06-207*8*@copyrightCopyright(c)20249*10*/1112#ifndef_HMAC_SHA_256_H_13#......
  • 现代分布式数据库 数据分布方式 Round-Robin、Range、List 和 Hash
    现代分布式数据库中,常见的数据分布方式有如下几种:Round-Robin、Range、List和Hash。如下图所示: 数据分布|StarRockshttps://docs.starrocks.io/zh/docs/table_design/Data_distribution/StarRocks的数据分布方式​StarRocks支持单独和组合使用数据分布方式。说明除......
  • 滚雪球学Java(65-3):详解Java IdentityHashMap的内部实现原理
      咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及JavaSE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~......
  • PTA 6-3 tjrac - Java集合类之Set的HashSet之常用方法的使用
    importjava.util.HashSet;importjava.util.Scanner;importjava.util.Set;publicclassMain{publicstaticvoidmain(String[]args){ Scannerscan=newScanner(System.in); Stringzi=scan.nextLine();//首先我们定义一个字符串输入; ......