下附代码
#include<bits/stdc++.h>
using namespace std;
const int MN=80005;
int a[MN][10],cnt[MN][10],xy[10],vis[10];
bool check(int x,int y)
{
for(int i=1;i<=4;i++)
if(cnt[x][i]!=cnt[y][i])
return false;
int cnt1=0;
memset(xy,0,sizeof(xy));
memset(vis,0,sizeof(vis));
for(int i=1;i<=8;i++)
if(a[x][i]!=a[y][i])
{
cnt1++;
xy[cnt1]=i;
}
if(cnt1>4||cnt1%2!=0)
return false;
else
{
int tem=cnt1;
for(int i=1;i<=tem;i++)
for(int j=i+1;j<=tem;j++)
{
if((a[x][xy[i]]==a[y][xy[j]]&&a[x][xy[j]]==a[y][xy[i]])&&(vis[i]==0&&vis[j]==0))
{
cnt1-=2;
vis[i]=vis[j]=1;
}
if(cnt1==0)
return true;
}
}
}
int main()
{
int n;
char tem;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=8;j++)
{
tem=getchar();
while(tem<'A'||tem>'Z')
tem=getchar();
switch(tem)
{
case 'A':a[i][j]=1,cnt[i][1]++;
break;
case 'T':a[i][j]=2,cnt[i][2]++;
break;
case 'C':a[i][j]=3,cnt[i][3]++;
break;
case 'G':a[i][j]=4,cnt[i][4]++;
break;
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(check(i,j))
ans++;
}
cout<<ans<<endl;
return 0;
}