交叉匹配

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值