P3405 Cities and States S
解题思路:字符串哈希
核心转换:城市+州 → 哈希值
步骤:
每读一个城市
求出"州+市"的hash匹配数
记录"市+州"的hash值
注意:
我们称两个城市是一个一对「特殊」的城市,如果他们具有上面的特性,并且来自不同的州
如果"州"="市"(的首两个字母),排除这个城市
比如:FLAME FL
假如它对答案有贡献,那么一定存在另一个city state,使得city首两个字母为FL,state首两个字母为FL
但是——这两个城市同州,不可能对答案有贡献!
代码:
#define P 37
typedef unsigned long long ULL;
using namespace std;
int n,cnt[N],ans;
ULL h,p[10];
string city,state,join;
void geth(string& s1,string& s2)//get hash
{
if(s1.substr(0,2)==s2) return;//易错点
join=s2+s1.substr(0,2);//州+城市
h=join[0];
for(int i=1;i<4;++i){
h=h*P+join[i];
}
ans+=cnt[h];//ans++匹配数
join=s1.substr(0,2)+s2;
h=join[0];
for(int i=1;i<4;++i){
h=h*P+join[i];
}
cnt[h]++;
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i){
cin>>city>>state;
geth(city,state);
}
cout<<ans;
return 0;
}
典型反例:
2
FLAME FL
FLINT FL

浙公网安备 33010602011771号