【LOJ10034】图书管理(哈希表,字符串)

举报
小哈里 发表于 2022/05/10 23:44:33 2022/05/10
【摘要】 problem 维护一个集合,支持以下两种操作 1. 加入一个字符串s 2. 查询集合中是否存在字符串s solution 维护一个哈希表,判断字符串是否已出现过。 codes #inclu...

problem

维护一个集合,支持以下两种操作
1. 加入一个字符串s
2. 查询集合中是否存在字符串s

solution

  • 维护一个哈希表,判断字符串是否已出现过。

codes

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 3e4+10, mod1 = 1e6+3, mod2 = 1e6+9, p1 = 47, p2 = 79;

int tot, head[mod1], nxt[maxn], val[maxn];//RE
void insert(int x, int y){
    nxt[++tot] = head[x];
    head[x] = tot;
    val[tot] = y;
}
bool query(int x, int y){
    for(int i = head[x]; i; i = nxt[i])
        if(val[i]==y)return true;
    return false;
}

int main(){
    int n;  scanf("%d",&n);
    while(n--){
        char op[10], s[210];
        cin>>op;
        gets(s);//读入剩余的一整行
        //双哈希,两个关键字决定一个字符串,减小误差
        int len = strlen(s), sum1=0, sum2=0;
        for(int i = 0; i < len; i++){
            sum1 = (sum1*p1+s[i])%mod1;//RE
            sum2 = (sum2*p2+s[i])%mod2;
        }
        if(op[0]=='a')insert(sum1,sum2);
        else {
            if(query(sum1,sum2))printf("yes\n");
            else printf("no\n");
        }
    }
    return 0;
}

  

文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/81539851

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。