文章目录
hash表 O(1)
840. 模拟散列表
#include <iostream>
using namespace std;
#include<cstring>
const int N = 100003;
int first_prim(int x) {
for(int i = x; ; i++) {
bool flag = true;
for(int j = 2; j * j<= i; j++) {
if(i % j == 0) {
flag = false;
break;
}
}
if(flag) {
cout << i << endl;
break;
}
}
return 0;
}
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++;
}
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 test_01()
{
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<cstring>
const int N = 200003, null = 0x3f3f3f3f;
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 test_02()
{
int n;
scanf("%d",&n);
memset(h,0x3f,sizeof(h));
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;
}
***字符串前缀hash法 (高效判断字符串-优于kmp)
typedef unsigned long long ULL;
const int N = 100010,P = 131;
int n,m;
char str[N];
ULL h[N],p[N];
ULL get(int l,int r)
{
return h[r] - h[l - 1] * p[r - l + 1];
}
int test_03()
{
scanf("%d%d%s",&n,&m,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,l2,r1,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(get(l1,r1) == get(l2,r2)) puts("Yes");
else puts("No");
}
return 0;
}
STL 常用容器
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
vector
string 字符串
pair 【自带了一个比较函数,比较first】
queue
优先队列 (大根堆)
stack
deque 双端队列 (功能全, 但缺点:速度慢很多)
set / multiset
bitset ,压位
#include<bits/stdc++.h>
int test_04()
{
vector<int> a;
a.size();
a.empty();
a.clear();
for(int i = 0;i < 10;i++) a.push_back(i);
for(int i = 0;i < a.size();i++) cout << a[i] << " ";
cout << endl;
for(vector<int>::iterator i = a.begin() ;i != a.end();i++) cout << *i << " ";
cout << endl;
cout << endl;
return 0;
}
int test_05()
{
pair<int , string> p;
p = make_pair(10,"wz");
p = make_pair(20,"abc");
pair<int, pair<int,string> > pp;
priority_queue<int> heap;
int x;cin >> x;
heap.push(-x);
cout << heap.top() << endl;
priority_queue<int,vector<int> ,greater<int> > small_heap;
map<string , int> a;
a[];
}
int main() {
test_05();
return 0;
}