原题链接
暴力构造后验证
#include<iostream>
#include<map>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
map<string, int>mp;
string a[1505];
char f(char a, char b)
{
if (a == b)return a;
else if ((a == 'S' && b == 'E') || (b == 'S' && a == 'E'))return 'T';
else if ((a == 'S' && b == 'T') || (b == 'S' && a == 'T'))return 'E';
else if ((a == 'E' && b == 'T') || (b == 'E' && a == 'T'))return 'S';
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
{
cin >> a[i];
mp[a[i]] = i;
}
int ans = 0;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
string p;
for (int k = 0; k < m; k++)
{
p += f(a[i][k], a[j][k]);
}
if (mp[p] > j)ans++;
}
}
cout << ans << endl;
}