题目描述
HZGD神牛是个非常牛B的人,每天都有人来向他请教问题.但是他有原则.同一个人不能在一个学期内请教他两次,并且他每天只见一个请教者, 无论他以前是否请教过,否则他就没时间去干其他事情了,嘿嘿(坏笑…就是不见宁智贤).于是,现在的问题就是,神牛并不是总记得每一个人.所以,你需要写一个程序帮助他判断每天接见的那个人是否请教过.
输入格式
输入的第一行是一个整数N( 1 < = N < = 50000 1 <= N <= 50000 1<=N<=50000),表示这个学期有多少天,也就是有多少人来请教。
接下来的 N N N 行中,每行包含一个字符串,第i行表示第i位请教的人的名字,名字的长度小于 201 201 201,且只包含小写字母.
输出格式
输出包括若干行,如果第i位请教者已经请教过了,那么就输出i,所有输出必须从小到大。即顺序输出所有HZGD不用回答请教者的时候.
样例数据
input
4
ab
ab
cc
ab
output
2
4
解题思路
- 这道题呢,可以用
s
e
t
set
set 或者
m
a
p
map
map 来做,(
当然大佬可以手写字符串哈希) - 貌似就是一个板子吧,不多说了,代码如下👇
Code
set做法
#include <bits/stdc++.h>
using namespace std;
int main ()
{
freopen("name.in","r",stdin);
freopen("name.out","w",stdout);
int n;
set <string> nam;
string s;
scanf("%d\n",&n);
for (int i=1;i<=n;i++)
{
getline(cin,s);
if (nam.count(s)>0) printf("%d\n",i);
else nam.insert(s);
}
return 0;
}
map做法
#include <bits/stdc++.h>
using namespace std;
map<string,int> a;
char s[210];
int main()
{
freopen("name.in","r",stdin);
freopen("name.out","w",stdout);
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%s",s);
a[s]++; //不想说啥,实在太爽了!
if (a[s]>1) printf("%d\n",i);
}
return 0;
}
后记
有帮助就点个赞吧QAQ