机翻
给定n个字符串,每个长度为2,由从'a'到'k'的小写拉丁字母组成,输出索引对(i,j)的数量,使得i <j和第i个字符串和j -th 字符串在一个位置上完全不同。
换句话说,计算对 (i, j) (i <j) 的数量,使得第 i 个字符串和第 j 个字符串恰好有一个位置 p (1 ≤ p ≤ 2),使得 sip ≠ sjp。
答案可能不适合 32 位整数类型,因此您应该使用 64 位整数,如 C++ 中的 long long 以避免整数溢出。
主要是字母个数以及字符串长度有限,所以可以通过固定字符串的一个值,然后去找前面与其中一个值想等的个数有多少,累加起来。
#include<bits/stdc++.h>
using namespace std;
const int N=30,mod=1e9+7;
int a[N][N];
int main()
{
int t;
cin>>t;
while(t--)
{
long long n,ans=0;
cin>>n;
memset(a,0,sizeof a);
for(int i=0;i<n;i++)
{
string s;
cin>>s;
for(int j=0;j<2;j++)
for(char c='a';c<='k';c++)
{
if(c==s[j])continue;
string t=s;t[j]=c;//固定一个值,找前面与另一个值相等的个数
ans+=a[t[0]-'a'][t[1]-'a'];//t[j]变为其他值,另外一个值还相等
}
++a[s[0]-'a'][s[1]-'a'];//记录下来这个字符串
}
cout<<ans<<'\n';
}
}