//哈希表(模板)

//拉链法
 #include <iostream>
 #include <cstring>
 using namespace std;

const int N = 1e5 + 3;
int h[N], e[N], ne[N], idx;

void insert(int x)
{
  int k = (x % N + N) % N;
  e[idx] = x;
  ne[idx] = h[k];
  h[k] = idx;
  idx++;
}

bool find(int x)
{
  int k = (x % N + N) % N;
  for (int i = h[k]; i != -1; i = ne[i])
  {
    if (e[i] == x)return true;
  }
  return false;
}

int main()
{
  int n;
  scanf("%d", &n);
  memset(h, -1, sizeof(h));
  while (n--)
  {
    char op[2];
    int x;
    scanf("%s%d", op, &x);
    if (*op == 'I')insert(x);
    else
    {
      if (find(x))puts("Yes");
      else puts("No");
    }
  }
  return 0;
}

//开放寻址法

#include <iostream>
#include <cstring>
using namespace std;

const int N = 200003, null = 0x3f3f3f3f; // null 查找域结尾标志
int h[N];

int find(int x)
{
    int k = (x % N + N) % N;
    while (h[k] != null && h[k] != x)
    {
        k++;
        if (k == N)k = 0;
    }
    return k;
}

int main()
{
    int n;
    scanf("%d", &n);
    memset(h, 0x3f, sizeof(h));//1个字节0x3f
    while (n--)
    {
        char op[2];
        int x;
        scanf("%s%d", op, &x);
        int k = find(x);
        if (*op == 'I') h[k] = x;
        else
        {
            if (h[k] != null) puts("Yes");
            else puts("No");
        }
    }
    return 0;
}

//字符串哈希

#include <iostream>
using namespace std;
 
typedef unsigned long long ULL;
const int N = 100010, P = 131;
int n, m;
char str[N];
ULL p[N], h[N];
 
ULL find(int l, int r){
    return h[r] - h[l - 1] * p[r - l + 1];
}
 
int main(){
    scanf("%d %d", &n, &m);
    scanf("%s", str + 1);
    p[0] = 1;
    for(int i = 1; i <= n; i++){
        p[i] = p[i - 1] * P;
        h[i] = h[i - 1] * P + str[i];
    }
    while(m--){
        int l1, r1, l2, r2;
        scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
        if(find(l1, r1) == find(l2, r2)) puts("Yes");
        else puts("No");
    }
    return 0;
}

更多推荐