由ASCII码’a'到‘k'是连着的,比如输入char的a储存在int中其实是数字97
创建一个二维数组int类型a[11][11],用来容纳a到k十一个字母,输入两个字母再让它们分别减去'a'可以得到它们对应的数字,比如输入字符型的a
可以得到以下的对应表
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
a | b | c | d | e | f | g | h | i | j | k |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
0 | aa | ab | ac | ad | ae | af | ag | ah | ai | aj | ak |
1 | ba | bb | bc | bd | be | bf | bg | bh | bi | bj | bk |
2 | |||||||||||
3 | |||||||||||
4 | |||||||||||
5 | |||||||||||
6 | |||||||||||
7 | |||||||||||
8 | |||||||||||
9 | |||||||||||
10 |
以此类推,填完表格
所以思路就很清晰了,我们先将那两个字符对应的那个点加一,再进行11次判断,让左字母不变查右字母的不同,或者让右字母不变查左字母是否不同
搜索方式如图
下为代码
memset(s,0,sizeof s)是将数组s全重置为0
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 10;
int s[15][15];
void solve()
{
ll ans = 0;
memset(s,0,sizeof s);
int n;
cin >> n;
char x,y;
for(int i = 1; i <= n; i++)
{
cin >> x >> y;
s[x - 'a'][y - 'a']++;
for(int j = 0; j < 11; j++){//j要小于11,从a到k均要遍历
//跳过它自己那个点
if(s[j][y-'a'] > 0 && j != x - 'a') ans+=s[j][y-'a'];
if(s[x - 'a'][j] > 0 && j != y - 'a') ans+=s[x - 'a'][j];
//如果有重复的输入,如重复输入两次,则加2
}
}
cout << ans << '\n';
}
int main(){
int _;
cin >> _;
while(_--) solve();
return 0;
}