[题目解析]找朋友

找朋友(friends)

时间限制: 1000 ms 空间限制: 262144 KB

题目描述

小学毕业后,同学们都进入了不同的初中,小明非常想念小伙伴们,所以他打算联系小学的同学们。
现在他得到了市内某所初中的所有名单,找出其中小明的小伙伴们。

输入

第一行一个整数n,表示某初中人数。
接下来n行,每行一个字符串,只有小写字母组成,表示该校每个人的拼音。数据保证没有人拼音相同,且已经按照字典序从小到大排序。
第n+2行有一个整数m,表示小明的小伙伴个数。
最后m行,每行一个字符串,只有小写字母组成,表示每个小伙伴的拼音,同样保证没有重复。

输出

输出所有在该校的小伙伴的拼音。
每行一个拼音,顺序按照小伙伴给出的顺序。

样例输入

样例输入1:
3
alice
bob
zhangsan
2
lisi
zhangsan
样例输入2:
2
lisi
zhangsan
3
zhangsan
lisi
alice

样例输出

样例输出1:
zhangsan
样例输出2:
zhangsan
lisi

数据范围限制

对于70%的数据,n<=1000,m<=100
对于100%的数据,n<=100000,m<=10000,每个人拼音长度不超过15。
所有数据,学校学生名单中的姓名,都是按照字典序从小到大排序。

提示

样例1解释:
学校有3人,小伙伴有2个,zhangsan在这个学校,因此输出zhangsan
样例2解释:
学校有2人,小伙伴有3个,有zhangsan和lisi两人出现在名单中,小伙伴名单输入时lisi在zhangsan后面,所以在输出的小伙伴名单中,lisi排在后面。

这道题目我一开始做的时候确实是想复杂了,做复杂了。不多说,先看10分代码,详见注释↓↓↓

#include
using namespace std;
int n,m;
struct friends{//结构体 
 int sum;//看看出现了几次 
 char name[16];//名字 
}a[100001],b[10001];
bool c[100001];
int s;
int main()
{
 cin>>n;//输入,不废话了 
 for(int i=1;i<=n;i++){
  cin>>a[i].name;
  a[i].sum=0; 
 }
 cin>>m;
 for(int i=1;i<=m;i++){
  cin>>b[i].name;
  b[i].sum=0;
 }
 for(int i=1;i<=m;i++){
  for(int j=1;j<=n;j++){//两层循环,找出有的名字 
   s=0;
   for(int k=1;k<=strlen(b[i].name);k++){//两两匹配,看看是不是一样 
    if((int)(a[j].name[k])==(int)(b[i].name[k])){//如果当前字母相同,S++; 
     s++;
    }
   } 
   if(s==strlen(b[i].name)){//如果全部字母都一样, b[i].sum++;
    b[i].sum++;
   }
  }
 }
 for(int i=1;i<=n;i++){
  if(b[i].sum){//如果SUM加过,那就输出 
   puts(b[i].name);
   cout<<endl;
  }
 }
} 

接下来来看100分代码吧!(详见注释),这份代码十分简洁↓↓↓↓

#include
using namespace std;
map<string,bool> mat;//使用map能更快捷完成本题 
int main()
{
 int n,m;
 string a;
 cin>>n;
 for(int i=1;i<=n;i++){
  cin>>a;
  mat[a]=true;//将mat[a]变成true,以便于后面判断 
 }
 cin>>m;
 for(int i=1;i<=m;i++){
  cin>>a;
  if(mat[a])cout<<a<<endl;//输进来一个就看看之前有没有出现过,如果有就输出 
 }
}
//超级简洁,18行代码搞定(((o(*゚▽゚*)o)))

这篇文章有什么不足请在评论区留言哦!♪(^∀^●)ノ
вye вyЁ

你可能感兴趣的:(题解,c++)