#include<bits/stdc++.h>
#define mod 233333 //定义模数
#define base //定义基数
using namespace std;
vector< pair<int,int> > linker[mod+2]; //定义一个变长二维数组,方便后面插入
int n,ans;
int calcHash(char a[],char b[])
{
int Hash=1;
Hash=a[0]-'A'+(a[1]-'A')*267+(b[0]-'A')*267*267+(b[1]-'A')*267*267*267;
return Hash;
}
inline int Find(int x)
{
for(int i=0;i<(int)linker[x%mod].size();i++){
if(linker[x%mod][i].first==x)
return linker[x%mod][i].second;
}
return 0;
}
void Insert(int x)
{
for(int i=0;i<(int)linker[x%mod].size();i++){
if(linker[x%mod][i].first==x) //第一个数存这个数本身,第二个数存这个数出现的次数
{
linker[x%mod][i].second++;
return;
}
}
linker[x%mod].push_back(pair<int,int>(x,1));
}
int main()
{
int n;
char a[12],b[12];
cin>>n;
while(n--){
cin>>a>>b;
// if(a[0]!=b[0]||a[1]!=b[1])
ans+=Find(calcHash(a,b)); //前缀哈希,先查找再插入
Insert(calcHash(b,a));
}
cout<<ans;
}
if(a[0]!=b[0]||a[1]!=b[1])
我是看洛谷书上的代码
不知道为什么不添加这一句话就会只有40分
加了这一句话就AC???