首页 > 其他分享 >[CTSC2014] 企鹅 QQ——哈希

[CTSC2014] 企鹅 QQ——哈希

时间:2024-10-13 16:22:51浏览次数:5  
标签:QQ 相似 30000 账户 64 名称 哈希 字符串 CTSC2014

[CTSC2014] 企鹅 QQ

题目背景

PenguinQQ 是中国最大、最具影响力的 SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志、群、即时通讯、相册、集市等丰富强大的互联网功能体验,满足用户对社交、资讯、娱乐、交易等多方面的需求。

题目描述

小 Q 是 PenguinQQ 网站的管理员,他最近在进行一项有趣的研究——哪些账户是同一个人注册的。经过长时间的分析,小Q发现同一个人注册的账户名称总是很相似的,例如 Penguin1,Penguin2,Penguin3……于是小 Q 决定先对这种相似的情形进行统计。

小 Q 定义,若两个账户名称是相似的,当且仅当这两个字符串等长且恰好只有一位不同。例如“Penguin1”和“Penguin2”是相似的,但“Penguin1”和“2Penguin”不是相似的。而小 Q 想知道,在给定的 \(n\) 个账户名称中,有多少对是相似的。

为了简化你的工作,小Q给你的N 个字符串长度均等于L ,且只包含大小写字母、数字、下划线以及‘@’共64种字符,而且不存在两个相同的账户名称。

输入格式

第一行包含三个正整数 \(N,L,S\)。其中 \(N\) 表示账户名称数量,\(L\) 表示账户名称长度,\(S\) 用来表示字符集规模大小,它的值只可能为 \(2\) 或 \(64\)。

若 \(S\) 等于 \(2\),账户名称中只包含字符 01 共 \(2\) 种字符;

若 \(S\) 等于 \(64\),账户名称中可能包含大小写字母、数字、下划线以及 @ 共 \(64\) 种字符。

随后 \(N\) 行,每行一个长度为 \(L\) 的字符串,用来描述一个账户名称。数据保证 \(N\) 个字符串是两两不同的。

输出格式

仅一行一个正整数,表示共有多少对相似的账户名称。

样例 #1

样例输入 #1

4 3 64
Fax
fax
max
mac

样例输出 #1

4

提示

\(4\) 对相似的字符串分别为:Fax 与 fax,Fax 与 max,fax 与 max,max 与 mac。

测试点编号 \(N\) \(L\) \(S\)
\(1\) \(50\) \(10\) \(64\)
\(2\) \(500\) \(100\) \(64\)
\(3\) \(3000\) \(100\) \(2\)
\(4\) \(3000\) \(100\) \(64\)
\(5\) \(30000\) \(50\) \(2\)
\(6\) \(30000\) \(50\) \(64\)
\(7\) \(30000\) \(200\) \(2\)
\(8\) \(30000\) \(200\) \(64\)
\(9\) \(30000\) \(200\) \(2\)
\(10\) \(30000\) \(200\) \(64\)

分析

注意到符合题意的字符串去掉不同的一位后所形成的字符串是相同的。

对于每个字符串,计算其去掉某一位后所形成的字符串的哈希值。

这样会产生至多\(N*L\)个哈希值,排序后可输出答案。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100,INF=0x7fffffff;
typedef unsigned long long ull;
ull key=137,bas[N];
char s[30010];
int n,len,siz,cnt;
ull all[6000100],h[30010];
void init()
{
    scanf("%d%d%d",&n,&len,&siz);bas[0]=1;
    for(int i=1;i<=len;++i)
        bas[i]=bas[i-1]*key;
    ull pre,bak;
    for(int i=1;i<=n;++i)
    {
        scanf("%s",s+1);
        for(int j=1;j<=len;++j)
        {
            h[j]=0;
            h[j]=h[j-1]*key+s[j];
        }
        for(int j=1;j<=len;++j)
        {
            //1~j-1
            pre=h[j-1];
            //j+1~len
            bak=(h[len]-h[j]*bas[len-j])*bas[j];
            all[++cnt]=pre+bak;
        }
    }
    sort(all+1,all+1+cnt);
    int st=1,ans=0;
    for(int i=2;i<=cnt;++i)
    {
        if(all[i-1]==all[i])++st;
        else {ans+=st*(st-1)/2;st=1;}
    }
    ans+=st*(st-1)/2;cout<<ans;
}
int main()
{
    init();
    return 0;
}









标签:QQ,相似,30000,账户,64,名称,哈希,字符串,CTSC2014
From: https://www.cnblogs.com/Glowingfire/p/18462509

相关文章

  • 使用wireshark对QQ进行抓包的详细过程
    实验需要工具:Wireshark,010editor/winhex涉及的安全方面知识:1.抓包(packetcapture)是指在网络传输过程中截获、重发、编辑、转存数据包的操作,主要用于检查网络安全和数据截取。‌ 2.Wireshark,010editor/winhex的使用方法3.HTTP:全称为HypertextTransferProtocol,翻译为中文......
  • CF1746F Kazaee(随机化哈希)
    真的做不来这种题怎么办/ll题意给定\(n\)个数,\(q\)次操作:单点修改一个数的值。查询区间内所有数的出现次数是否均为\(k\)的倍数。\(n,q\le3\times10^5\)。分析一眼看上去只能带修莫队,而且常数还巨大无比。这种随机化哈希题一般是考虑一个必要不充分条件,但是充分的......
  • lake3哈希算法的介绍、特点、原理与Blake3.Net的特点
    1.Blake3的介绍与特点哈希函数专为文件完整性验证等应用而设计,加密数字签名的消息认证和数据生成。Blake3不是为散列密码而设计的,因为它旨在尽可能快地计算散列(对于密码,建议使用慢散列和escrypt、bcrypt、scrypt或Argon2函数)。所讨论的散列函数对正在处理的数据大小不敏感,并......
  • 哈希
    哈希常用于需要\(O(1)\)比较两个\(O(n)\)的东西。可以采用双模数减少冲突概率。哈希冲突率的粗略计算:可以看做\(\frac{n}{\prodmod}\)。字符串哈希常用于需要\(O(1)\)比较两个字符串,可以代替一些字符串匹配的KMP题目。以及可以使用哈希+二分的技巧\(\log\)的时......
  • SMB签名是一种通过数字签名技术保障数据在网络传输过程中的完整性和来源验证的机制。
    SMB签名是ServerMessageBlock(SMB)协议中的一种安全机制,旨在确保数据的完整性和身份验证。1.什么是SMB签名?SMB签名是一种通过数字签名技术保障数据在网络传输过程中的完整性和来源验证的机制。它通过对数据进行哈希处理,并附加一个签名,确保接收方能够确认收到的数据没有被篡改。......
  • 无聊时整一个仿qq版用户注册
    springboot+mybatisplus开始展示相信很多小伙伴在写注册用户时应该都是传统的账号加密码进行用户注册此时为什么不动动自己聪明的小脑袋瓜写一个另类的注册功能呢我们常用的qq这种注册方法到现在也是很新颖的,这是我们就应该想到他这个账号是如何形成的。qq注册就是输入用......
  • Redis 数据类型hash(哈希)
    目录1基本特性2主要操作命令 2.1设置和获取字段2.1.1 HSETkeyfieldvalue2.1.2 HGETkeyfield2.1.3 HMSETkeyfield1value1[field2value2...] 2.1.4 HMGETkeyfield1[field2...]2.2检查字段是否存在2.2.1 HEXISTSkeyfield2.3获取所有字段和......
  • 散列表(Hash table哈希表)应用案例
    文章目录散列表基础内容散列表的基本操作包括:散列表的关键组成部分:散列表的优点:散列表的缺点:实现散列表的方法1.散列函数的设计2.冲突解决策略3.重新哈希实现示例具体案例展示步骤:Python实现:输出结果:扩展功能:Python实现:输出结果:新增功能解释:进一步扩展:散列表......
  • 记录一道面试题(哈希表 稀疏矩阵)
    题目:有一个游戏中的三维地图,是由i,j,k三个轴组成的三维网络。每个立方体由不同的种类代表,比如空气,水,沙子,泥土。地图上方的空气方块,不会经常变动且数量占大多数,下方是各种类型的方块,会经常相互转换(水变沙子,沙子变泥土等)。问题:请你实现一个存储该地图的方案(地图方块和对应类型)。要......
  • 【JS】哈希法解决两数之和
    思路使用哈希法:需要快速查询一个元素是否出现过,或者一个元素是否在集合里时本题需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,符合要求的某元素是否遍历过,也就是是否出现在这个集合。因为要返回下标,所以使用Map集合,key存放元素值,value存放元素下......