洛谷:P3405 [USACO16DEC]Cities and States S(stl)

题目:

分析:自己想了想貌似不需要图,第一想法就是map,瞄了一下题解,是map,自己继续想吧。

呵呵,看题解吧:

#include<bits/stdc++.h>
using namespace std;
map<string,string> m1;//存放对应关系 
map<string,vector<string> > m2;//开头为XX的 有哪些单词 
vector<string> vs;
int main()
{
 int m;
 cin>>m;
 for(int i=0;i<m;i++)
 {
  string s1,s2;
  cin>>s1>>s2;
  m1[s1]=s2;
  string s3=s1.substr(0,2);
  m2[s3].push_back(s1);
  vs.push_back(s1);
 }
 //cout<<m1["FLINT"];
 int ans=0;
 for(int i=0;i<m;i++)
 {
  //m2[m1[vs[i]]]
  for(int j=0;j<m2[m1[vs[i]]].size();j++)
  {//m2[m1[vs[i]]][j]
   if(m1[m2[m1[vs[i]]][j]]==vs[i].substr(0,2)) ans++;
  }
 }
 cout<<ans/2;
}

在这里插入图片描述

既然想到了结果应该除以2,那为什么没有考虑到其实只需要一遍遍历呢?

智力真的不行了吗,把问题抽出来思考的能力也太差了吧。

很简单的抽出来思考,自己竟然写的那么麻烦。。。。无语。

#include<bits/stdc++.h>
using namespace std;
map<int,int> mmp[100005];
int n,ans;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        string a,b;
        cin>>a>>b;
        int A=a[0]*26+a[1];
        int B=b[0]*26+b[1];
        if(A!=B) ans+=mmp[B][A];
        //ans+=mmp[B][A];
        //if(A==B)ans-=mmp[A][B];
        mmp[A][B]++;
    }
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/108422505