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 }