2019 上海网络赛G 手写哈希map+字符串hash

https://nanti.jisuanke.com/t/41415

因为对于询问$\sum |s|<=1e5$,因此$|s|$的种类数$<=\sqrt{1e5}$

我们分组标记,就变成了$\sqrt{1e5}$次询问了,我们暴力去跑,

复杂度$1e5\sqrt{1e5}*hashmap$

暴力+哈希+$unordermap$计数,嗯,果然TLE了

然后手写一个$hashmap$,跑的飞快...

#include<bits/stdc++.h>
#define ull unsigned long long
#define fi first
#define se second
#define mp make_pair
#define pii pair<ull,int>
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
const int maxn=1e5+10,maxm=3e5+17;
const ull mod=1e9+7;
int casn,n,m;
char a[maxn],b[maxn];
ull pw[200];
int len[20010],ans[20010];
vector<pii> ask[maxn];
class hash_map{public:
  struct node{ull u;int v,next;}e[maxm<<1];
  int head[maxm],nume,numk,id[maxm];
  int& operator[](ull u) {
    int hs=u%maxm;
    for(int i=head[hs];i;i=e[i].next)
      if(e[i].u==u) return e[i].v;
    if(!head[hs])id[++numk]=hs;
    return e[++nume]=(node){u,0,head[hs]},head[hs]=nume,e[nume].v;
  }
  void clear(){
    rep(i,0,numk)head[id[i]]=0;
    numk=nume=0;
  }
}cnt;
int main(){
  pw[0]=1;rep(i,1,131) pw[i]=pw[i-1]*mod;
  ull base1=pw[130],base2=pw[131];
  cin>>casn;
  while(casn--){
    cin>>(a+1)>>m;
    int n=strlen(a+1);
    rep(i,1,m){
      cin>>(b+1);
      len[i]=strlen(b+1);
      ull hs=base1*b[1]+base2*b[len[i]];
      rep(j,2,len[i]-1) hs+=pw[b[j]];
      ask[len[i]].emplace_back(mp(hs,i));
    }
    int k=unique(len+1,len+1+m)-len-1;
    rep(i,1,k){
      int l=len[i];
      ull hs=0;
      rep(j,2,l-1) hs+=pw[a[j]];
      rep(j,1,n-l+1){
        ++cnt[hs+base1*a[j]+base2*a[j+l-1]];
        hs+=pw[a[j+l-1]]-pw[a[j+1]];
      }
      for(auto &j:ask[l]) ans[j.se]+=cnt[j.fi];
      cnt.clear();
      ask[l].clear();
    }
    rep(i,1,m) {
      cout<<ans[i]<<‘\n‘;
      ans[i]=0;
    }
  }
}

原文地址:https://www.cnblogs.com/nervendnig/p/11525346.html

时间: 2024-11-05 23:21:05

2019 上海网络赛G 手写哈希map+字符串hash的相关文章

2019 ICPC上海网络赛 G. Substring 哈希+尺取法+unordered_map

题目链接:https://nanti.jisuanke.com/t/41415 赛后补题. 参考博客:https://blog.csdn.net/bjfu170203101/article/details/100889468 题意:给出一个主串(假设长度为m),再给出n个模式串,对于每一个模式串,如果在主串中有一个子串,它的第一个字符和最后一个字符分别与这个模式串的开头字符和结尾字符相同,并且每一种字符出现的次数相同,那么就把这个模式串和这个子串看成是相同的,认为模式串在主串中出现过一次,比如模

【2019上海网络赛】

B题:分成两序列,A>B,A-(a[i]属于A里面的)<=B; #include<bits/stdc++.h>using namespace std;#define ll long longconst ll mod=1e9+7;const ll inf=1e18;ll dp[300*500+5];int a[300];int main(){ int t; scanf("%d",&t); while(t--) { int n,s=0; scanf(&quo

ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询问子区间中某个值域的数的个数,连续的相同数字只记为一个.(即统计数字段的个数) 2 L R x y 数据范围: 1 ≤ n,m ≤ 2×10^5 1 ≤ a[i] ≤ n 解题思路: 连续重复的数字只记一次.所以考虑将每个数字段除第一个出现外的数字都删去(记为0).在读入操作的时候暴力模拟,同时维护

2019徐州网络赛 XKC&#39;s basketball team 线段树

网址:https://nanti.jisuanke.com/t/41387 题意: 大家好,我是训练时长两年半的个人练习生蔡徐坤,我的爱好是唱,跳,rap,篮球. 给出一段长度为$n,(n \leq 1e5)$的序列,对每一个数,求出它和它后面比它大$m$的数中间夹着的数的数量,没有输出$-1$. 题解: 直接建线段树,维护最大值,然后查询时对第$i$个数,搜索区间$[i,n]$之中大于$num[i]+m$的值的位置的最大值,具体操作是先限定区间,然后求出所有合法位置,取最大值,如果搜索不到则返

手写哈希类

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #define Mod 100007 //取模的大小,哈希表的大小... 5 #define Max 50 //存放的总数 6 typedef long long LL; 7 class Hash //手写哈希 8 { 9 public: 10 int hs[Mod]; //哈希值 设定的哈希函数为 原值 % Mod ,所以哈希值有可能是 0 ~

HDU 5183 Negative and Positive (NP) (手写哈希)

题目链接:HDU 5183 Problem Description When given an array \((a_0,a_1,a_2,?a_{n?1})\) and an integer \(K\), you are expected to judge whether there is a pair \((i,j)(0≤i≤j<n)\) which makes that \(NP?sum(i,j)\) equals to \(K\) true. Here \(NP?sum(i,j)=a_i?

2019 CCPC网络赛

一到网络赛,大家都是东亚之光 1001 00:23:46 solved by hl 签到 枚举一下位就行了 #include <map> #include <set> #include <ctime> #include <cmath> #include <queue> #include <stack> #include <vector> #include <string> #include <bitset

2019秋招复习笔试--手写代码

1. 手写一个单例模式 2. 手写一个生产者消费者模式 3. 手写一个LRU算法的实现: 4. 手写快排 5. 手写堆排 6. 手写树的遍历(先序.中序.后序.层序) 7. 手写一个二分查找 #. 剑指OFFER #. LeetCode 原文地址:https://www.cnblogs.com/greatLong/p/11505100.html

[Codevs 1230]元素查找(手写哈希表)

题目连接:http://codevs.cn/problem/1230/ 说白了就是要我们自己手写一个哈希表的数据结构来实现添加和查找功能,map也能直接过(我第一次写就是用map骗AC的) 提一下个人理解的哈希表的实现(下面说的是线性寻址法),如果有误还请各位大神不吝指教 用一个数组模拟哈希表,函数f(x)=数字x在哈希表中出现的下标的最小可能值,一般f(x)=x mod t,t就是哈希表的长度 下面就是一个哈希表的示例,如果遍历哈希表时指针走出了哈希表的终点,就进入起点重新遍历 对于每次向哈希