map嵌套大法超级简单的哦
TESJackeyLove · · 题解
map嵌套大法好~
昨天刚用map嵌套过了一道题,今天又碰到了可以用嵌套map解决的题了~
map<int,map<int,int> >m;
- 个人觉得,嵌套map可以用于尝试解决二维数组炸下标的题。这里定义一个名为m的嵌套map,然后m[i][j]表示什么呢?字符串嘛,我们给它转化一下,因为只涉及到前两位字母(大写字母ascii码不超过100),所以我们可以用第一位字母的ascii码乘以100+第二位字母的ascii码作为下标表示这个字符串。那么第一维的i就是前面字符串转换后的结果,第二维的j就是后面字符串转换后的结果。那么m[i][j]就表示(i,j)这一对出现的次数。
- 我们可以边输入边操作,如果当前的两个字符串转换后是(i,j),那么它就可以和(j,i)构成一对特殊城市,所以此时答案加上m[j][i]就可以了。
- 一个需要注意的点就是判别i==j,加上又要减去,不如不加。以下是代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<map> #include<vector> #include<queue> #include<stack> #include<set> #define fore(i,a,b) for(register int i=a;i<=b;i++) #define foru(i,a,b) for(register int i=a;i<b;i++) #define ford(i,a,b) for(register int i=a;i>=b;i--) #define IGNB std::ios::sync_with_stdio(false); #define ll long long #define INF 0x3fffffff using namespace std; map<int,map<int,int> >m; string x,y; int main(){ IGNB; int n,cnt=0; cin>>n; fore(i,1,n){ cin>>x>>y; int x1=x[0]*100+x[1]; int y1=y[0]*100+y[1]; if(x1!=y1){ cnt+=m[y1][x1]; m[x1][y1]++; } } cout<<cnt; return 0; }