【题目描述】
为了预防“老牛痴呆”,农夫约翰在谷仓挂了一幅美国地图。一些聪明的奶牛注意到了一些奇怪的事情。现在给出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.