P3370 【模板】字符串哈希

题目传送门

思路:

这道题目要求我们计算给定的N个字符串中有多少个不同的字符串。为了高效地解决这个问题,我们可以使用哈希表来存储和去重字符串。

  1. 读取输入:首先读取输入的整数N,表示字符串的个数。
  2. 读取字符串:接着读取N行字符串。
  3. 使用集合去重:将每个字符串添加到一个集合中,集合会自动去重。
  4. 输出结果:最后输出集合的大小,即不同字符串的个数。

代码&解释:

c++代码:

#include<iostream>
#include<istream>
#include<ostream>
#include<string>
#include<algorithm>
#include<bitset>
#include<cmath>
#include<queue>
#include<map>
#include<iomanip>
using namespace std;
map<string,bool>ma;
int n,ans;
int main(){
	cin>>n;

	ans = 0;
	for(int i = 1;i <= n;i++){
		string str;
		cin>>str;
		if(ma[str] == 1) continue;
		else ans++,ma[str] = 1;
	}
	
	cout<<ans;
	return 0;
}

代码解释:

  1. 全局变量

    map<string,bool>ma;
    int n,ans;
    
    • ma:一个map数据结构,用于存储字符串及其对应的布尔值(表示该字符串是否已经出现过)。
    • n:整数,表示字符串的个数。
    • ans:整数,用于计数不同的字符串个数。
  2. 主函数

    int main(){
        cin>>n;
    
    • 读取输入的整数n,表示字符串的个数。
  3. 初始化计数器

        ans = 0;
    
    • 初始化计数器ans为0。
  4. 循环读取字符串

        for(int i = 1;i <= n;i++){
            string str;
            cin>>str;
    
    • 使用for循环读取n个字符串,每次读取一个字符串并存储在str中。
  5. 检查字符串是否已存在

            if(ma[str] == 1) continue;
    

    检查ma中是否已经存在该字符串,如果存在则跳过当前循环。

  6. 更新计数器和映射

            else ans++,ma[str] = 1;
    
    • 如果字符串不存在于ma中,则将计数器ans加1,并在ma中标记该字符串为已存在。
  7. 输出结果

        cout<<ans;
        return 0;
    }
    
    • 输出不同字符串的个数ans,并返回0表示程序正常结束。

Python代码:

# 读取输入的整数N
N = int(input())

# 使用集合来存储不同的字符串
unique_strings = set()

# 读取N行字符串并添加到集合中
for _ in range(N):
    string = input().strip()
    unique_strings.add(string)

# 输出不同字符串的个数
print(len(unique_strings))

代码解释:

  1. 读取N:使用int(input())读取整数N。
  2. 初始化集合unique_strings = set()创建一个空的集合用于存储不同的字符串。
  3. 循环读取字符串:使用for _ in range(N)循环N次,每次读取一个字符串并使用input().strip()去除可能的空白字符,然后将其添加到集合中。
  4. 输出结果:使用print(len(unique_strings))输出集合的大小,即不同字符串的个数。
希望这些代码能帮助您理解并解决这个问题,如果有问题,请随时提问。
  蒟蒻题解,神犇勿喷,点个赞再走吧!QAQ
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值