头像

欢迎来到我的博客

分享题解与总结

P3405 Cities and States S

解题思路:字符串哈希

核心转换:城市+州 → 哈希值

步骤:

每读一个城市

求出"州+市"的hash匹配数

记录"市+州"的hash

注意:

我们称两个城市是一个一对「特殊」的城市,如果他们具有上面的特性,并且来自不同的州

如果"州"="市"(的首两个字母),排除这个城市

比如:FLAME FL

假如它对答案有贡献,那么一定存在另一个city state,使得city首两个字母为FLstate首两个字母为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
posted @ 2026-06-22 15:10  king_steph1209  阅读(10)  评论(0)    收藏  举报