Description
给出n个字符串,如果两个字符串之间存在一个字母表双射使得一个串变成另一个串,那么这两个串相似,问这n个串中有多少对相似的字符串
Input
第一行一整数n表示字符串数量,之后n个字符串,总串长不超过1e6
Output
输出相似字符串对数
Sample Input
4
abacaba
tetatet
test
bear
Sample Output
1
Solution
按出现先后把每个字符串标准化,即第一个出现的字符变a,第二个字符变b……以此类推,用map存下这些标准化之后的串出现的次数,对于一个串s,累加m[s]到答案中,之后m[s]++即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 1111111
string s;
map<string,int>m;
int n,vis[33];
int main()
{
while(~scanf("%d",&n))
{
m.clear();
ll ans=0;
while(n--)
{
memset(vis,-1,sizeof(vis));
cin>>s;
int res=0;
for(int i=0;i<s.size();i++)
{
if(vis[s[i]-'a']==-1)vis[s[i]-'a']=res++;
s[i]=vis[s[i]-'a']+'a';
}
ans+=m[s];
m[s]++;
}
printf("%I64d\n",ans);
}
return 0;
}