string str;
cin>>str;
string a=str.substr ( i , mid ); //求str里从i开始,长度为mid的字符串;
处理冲突用两张方法,开放寻址法或者拉链法。
(取模的数要尽可能为质数且离2的整数幂最远)
找到第一个符合条件的数
for (int i = 1e5;; 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;
}
}
拉链法:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
//
//for (int i = 1e5;; 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;
// }
// 算出N的值
//}
int n;
const int N = 1e5 + 3;
int h[N], idx, e[N], ne[N];
void insert(int b)
{
int k = (b % N + N) % N;
e[idx] = b;
ne[idx] = h[k];
h[k] = idx++;
}
void find(int b)
{
int k = (b % N + N) % N;
for(int i=h[k];i!=-1;i=ne[i])
{
if (e[i] == b)
{
cout << "Yes" << endl;
return;
}
}
cout << "No" << endl;
}
int main()
{
cin >> n;
memset(h, -1, sizeof h);
while (n--)
{
char a;
int b;
cin >> a >> b;
if (a == 'I')
{
insert(b);
}
else
{
find(b);
}
}
}
开放寻址法:
首先要将数组的所有初始值设为无穷大,一般设为0x3f3f3f3f,然后直接memset( a,0x3f,sizeof a)就可以了
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
//
//for (int i = 1e5;; 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;
// }
// 算出N的值
//}
int n;
const int N = 200003, null = 0x3f3f3f3f;
int h[N];
int find(int b)
{
int k = (b % N + N) % N;
while (h[k] != null && h[k] != b)
{
k++;
if (k == N)k = 0;
}
return k;
}
int main()
{
int n;
cin >> n;
memset(h, 0x3f, sizeof h);
while (n--)
{
char a;
int b;
cin >> a >> b;
int k = find(b);
if (a == 'I')
{
h[k] = b;
}
else
{
if (h[k] != null)cout << "Yes" << endl;
else cout << "No" << endl;
}
}
}