题目
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 103;
string s1, s2;
int res;
int h[N];
int find(int x)
{
int k = x % N;
while(h[k] != -1 && h[k] != x)
{
if(k++ == N)
k = 0;
}
return k;
}
int base(string tmp, int x)
{
int num = 0;
for(int i = 0; i < tmp.size(); i++)
{
num *= x;
num += (tmp[i] - '0');
}
return num;
}
int main()
{
memset(h, -1, sizeof h);
cin >> s1 >> s2;
for(int i = 0; i < s1.size(); i++)
{
string tmp = s1;
tmp[i] ^= 1;
int num = base(tmp, 2);
if(tmp[0] != '0' || num == 0) h[find(num)] = num;
}
for(int i = 0; i < s2.size(); i++)
{
bool flag = false;
for(int j = 0; j < 3; j++)
{
if((s2[i] - '0') != j)
{
string tmp = s2;
tmp[i] = j + '0';
int num = base(tmp, 3);
if(h[find(num)] != -1)
{
flag = true;
res = num;
break;
}
}
}
if(flag)
{
cout << res;
break;
}
}
return 0;
}
思考
1.手写哈希表(我用开放寻址法)要比unordered_set<int>快
2.一般哈希的内容要能转换为唯一的数字才好用手写哈希表,不然还是用STL吧
3.我之前用的转换进制的方法是(num, w)法,也可以用秦九韶法num += num*r + s[i] - '0'
4.前导零的处理就从需求上入手,s[0] != ’0‘ || num == 0,要么没前0,要么就是0没有前导零出现的可能