1. 해시 테이블
Hahs 테이블 저장 구조
문자열 해시
1.1 지퍼 방식
케이스 코드는 다음과 같습니다.
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100003;
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 main()
{
int n;
scanf("%d",&n);
//清空槽
memset(h,-1,sizeof h);
while(n --)
{
char op[2];
scanf("%s%d",op,&x);
if(*op == 'I') insert(x);
else
{
if(find(x)) puts("yes")
else
{
puts("No");
}
}
}
return 0;
}
1.2 개방 주소 지정 방법
케이스 코드는 다음과 같습니다.
#include<iostream>
using namespace std;
const int N = 200003,null = 0x3f3f3f3f;
int h[N];
//插入
void find(int x)
{
int k = (x % N + N) % N;
while(h[k] != null && h[k] != x)
{
k ++;
if(k == N) k=0;
}
return k;
}
1.3 문자열 해싱
케이스 코드는 다음과 같습니다.
#include<iostream>
#include<cstring>
typedef unsigned long long ULL;
const int N = 100010,P = 31;
int n,m;
char str[N];
ULL h[N],q[N];
ULL get(int l,int r)
{
return h[r] - h[l - 1] * p[r - l + 1];
}
int main()
{
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,r1,l2,r2;
scanf("%d%d%d%,&d",&l1,&r1,&l2,&r2);
if(get(l1,r1) == get(l2,r2)) puts("Yes");
else
{
puts("No");
}
}
}
둘, STL 컨테이너
2.1벡터
가변 길이 배열(배열 아이디어)
케이스 코드는 다음과 같습니다.
int main()
{
//vector初始化
vector<int> a(10,1);
//vector数组
//vector<int> a[10];
//常用函数
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]<<" ";
}
//支持比较运算
vector<int> b<4,3>,c<3,4>;
if(a < b) puts("a < b");
return 0;
}
2.2문자열
문자열 substr(), c_str()
int main()
{
string a = "abcdef";
a += "cd";
a += 'z';
//截取字符串
cout<<a.substr(1,3)<<endl;
//获取存取字符串的起始地址
printf("%s\n",a.c_str());
return 0;
}
2.3대기열(priority_queue)
큐: push(), front(), pop()
push(); //向队尾插入一个元素
front(); //返回队头元素
back(); //返回队尾元素
pop(); //弹出队头元素
우선순위 큐(priority_queue)
push(); //向堆中插入一个元素
top(); //返回堆顶元素
pop(); //弹出堆顶元素
2.4스택
스택: push(), top(), pop()
push(); //向栈顶插入一个元素
top(); //返回堆顶元素
pop(); //弹出堆顶元素
2.5 및
양방향 대기열, 임의 액세스 지원(거의 사용되지 않음)
push_back()/pop_back();
front();
back();
push_fornt()/pop_front();
clear();
begin()/end();
2.6세트
집합에 중복 요소가 있을 수 없습니다.
균형 잡힌 이진 트리(레드-블랙 트리) 구현을 기반으로 정렬된 시퀀스를 동적으로 유지
insert(); //插入一个数
find(); //查找一个数
count(); //返回某一个树的个数
erase(); //输入是一个数x,则删除有所有x
//输入一个迭代器,删除这个迭代器
2.7지도
균형 잡힌 이진 트리(레드-블랙 트리) 구현을 기반으로 정렬된 시퀀스를 동적으로 유지
insert(); //插入一个数
find(); //查找一个数
erase(); //输入参数为pair或迭代器
2.8비트세트
압력 위치
count(); //统计有多少个1
any(); //判断是否至少有一个1
none(); //判断是否全为0
set(); //把所有位置变为1
set(k,v); //将第k位变为v
reset(); //把所有位变为0
flip(); //等价于~
flip(k); //把第k位取反