https://vjudge.net/problem/Gym-100247B

题意:

如果两个字符串通过映射后是一样的,则说明这两个字符串是相似的,现在给出n个字符串,计算出有多少组字符串是相似的。

 

思路:
直接暴力超时了。。

拿样例来说吧,abacaba可以转化成1213121。那么和它相似的字符串也能转化成这个数字串,比如说tetatet,它映射后也能变成1213121。

这样对每个字符串处理一遍就可以了。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<vector>
 5 #include<map>
 6 using namespace std;
 7 const int maxn = 1e6+5;
 8 
 9 char s[maxn];
10 int used[30];
11 
12 vector<int> v;
13 map<vector<int>, int> mp;
14 
15 int main()
16 {
17     //freopen("in.txt","r",stdin);
18     int n;
19     long long ans = 0;
20     scanf("%d",&n);
21     for(int i=1;i<=n;i++)
22     {
23         scanf("%s",s);
24         int len = strlen(s);
25         int num = 0;
26         memset(used,0,sizeof(used));
27         v.clear();
28         for(int i=0;i<len;i++)
29         {
30             int c = s[i]-'a';
31             if(used[c])  v.push_back(used[c]);
32             else
33             {
34                 used[c] = ++num;
35                 v.push_back(used[c]);
36             }
37         }
38         ans+=mp[v]++;
39     }
40     printf("%lld\n",ans);
41     return 0;
42 }