JZOJ 【字符串hash】请教神牛 (map/set)

该博客介绍了一个关于如何使用C++ STL中的set或map数据结构,来判断字符串是否重复的问题。在学期中,神牛需要避免重复接待请教者,程序需要检查每天的请教者是否已请教过。博客提供了输入输出格式、样例数据和两种不同的解题思路,包括set和map实现,并邀请读者点赞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值