P3370 【模板】字符串哈希
题目描述
输入格式
输出格式
输入 #1
5
abc
aaaa
abc
abcc
12345
输出 #1
4
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
#define mod 1000000007;
char s[10010][2000];
int n,h[10010],p=13331;
int main()
{
cin>>n;
int i,j,w;
long long int ans=1;
for(i=0;i<n;i++)
{
cin>>s[i];
int l=strlen(s[i]);
for(j=0;j<l;j++)
{
h[i]+=s[i][j]*p;
h[i]=(h[i]*10)%mod;
}
}
sort(h,h+n);
//for(i=0;i<n;i++)
//cout<<h[i]<<' ';
for(i=1;i<n;i++)
if(h[i]!=h[i-1])
ans++;
cout<<ans;
}
总结
字符串哈希,可以将一串字符转化为整数,再通过整数来判断这一串字符有没有出现过,一般乘以素数,如:131,13331,2333等,或最大值,然后再对素数1e9+7取模。
P1102 A-B 数对
题目描述
输入格式
输出格式
输入 #1
4 1
1 1 2 3
输出 #1
3
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cstdio>
using namespace std;
map<int, int >m;
int n, c, i,a[200010];
int main()
{
cin >> n >> c;
for (i = 0; i < n; i++)
{
cin >> a[i];
m[a[i]]++;
a[i] = a[i] - c;//map就是一个映射,里面的元素是唯一的,所以我们标记完后就做差,再用差去找个数就行了
}
long long int ans = 0;
for (i = 0; i<n; i++)
{
if (m[a[i]] > 0)
ans+=m[a[i]];//比如说a[i]=2,找1的个数,两个,总值加二
}
cout << ans;
}
总结
建立一个map的映射,由数字到数字的出现次数,然后输入数组。因为题目要求A-B=C的对数,我们可以转化为A-C=B,这样我们每输入一个数,建立映射之后就将它做差,再将做差之后的数组去找出现的次数,就可以得到答案了。