交叉匹配

来源:互联网 发布:刷网站ip软件 编辑:程序博客网 时间:2024/06/05 03:53

【题目描述】
为了预防“老牛痴呆”,农夫约翰在谷仓挂了一幅美国地图。一些聪明的奶牛注意到了一些奇怪的事情。现在给出N个城市和它们所在的州(州以两个字母写出),如果a城市的市名(取前两个字母)和b城市的州相同,且a城市的州名和b城市的市名(也取前两个字母)相同,就称为一次匹配。求有多少个匹配。
【输入格式】
第一行一个整数N(1<=N<=200000)
接下来N行,每行两个字符串a和b(以一个空格隔开)表示第i个城市的市名是a,州名是b(2<=length(a)<=10,length(b)=2)
a和b都是大写的。
【输出格式】
有多少个匹配
【样例输入】
6
MIAMI FL
DALLAS TX
FLINT MI
CLEMSON SC
BOSTON MA
ORLANDO FL
【样例输出】
1
【样例说明】
第1个城市和第3个城市是匹配的
【分析】
令Sum[a,b,c,d]表示城市名以ab开头,州名为cd的城市个数,则输出sum[‘A’..’Z’,’A’..’Z’,’A’..’Z’,’A’..’Z’]的和即可,注意判重。

var  i,n:longint;  ans:qword;  sum:array['A'..'Z','A'..'Z','A'..'Z','A'..'Z']of longint;  st:string;    a,b,c,d:char;begin  fillchar(sum,sizeof(sum),0);  readln(n);  for i:=1 to n do begin    readln(st);        a:=st[1];        b:=st[2];        c:=st[length(st)-1];        d:=st[length(st)];        if (a<>c)or(b<>d) then inc(sum[a,b,c,d]);  end;  ans:=0;    for a:='A' to 'Z' do      for b:='A' to 'Z' do        for c:='A' to 'Z' do          for d:='A' to 'Z' do                    ans:=ans+sum[a,b,c,d]*sum[c,d,a,b];  write(ans div 2);end.
3 0
原创粉丝点击