Hahs表存储结构
字符串Hash
案例代码如下:
#include
#include
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;
}
案例代码如下:
#include
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;
}
案例代码如下:
#include
#include
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");
}
}
}
变长数组(倍增思想)
案例代码如下:
int main()
{
//vector初始化
vector a(10,1);
//vector数组
//vector 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< b<4,3>,c<3,4>;
if(a < b) puts("a < b");
return 0;
}
字符串 substr(),c_str()
int main()
{
string a = "abcdef";
a += "cd";
a += 'z';
//截取字符串
cout<
队列:push(),front(),pop()
push(); //向队尾插入一个元素
front(); //返回队头元素
back(); //返回队尾元素
pop(); //弹出队头元素
优先队列(priority_queue)
push(); //向堆中插入一个元素
top(); //返回堆顶元素
pop(); //弹出堆顶元素
栈:push(),top(),pop()
push(); //向栈顶插入一个元素
top(); //返回堆顶元素
pop(); //弹出堆顶元素
双端队列,支持随机访问(用的很少)
push_back()/pop_back();
front();
back();
push_fornt()/pop_front();
clear();
begin()/end();
set中不可以有重复元素
基于平衡二叉树(红黑树)实现,动态维护有序序列
insert(); //插入一个数
find(); //查找一个数
count(); //返回某一个树的个数
erase(); //输入是一个数x,则删除有所有x
//输入一个迭代器,删除这个迭代器
基于平衡二叉树(红黑树)实现,动态维护有序序列
insert(); //插入一个数
find(); //查找一个数
erase(); //输入参数为pair或迭代器
压位
count(); //统计有多少个1
any(); //判断是否至少有一个1
none(); //判断是否全为0
set(); //把所有位置变为1
set(k,v); //将第k位变为v
reset(); //把所有位变为0
flip(); //等价于~
flip(k); //把第k位取反