P4503 [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\) ,账户名称中只包含字符 \(‘0’\) 和 \(‘1’\) 共 \(2\) 种字符;

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

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

输出格式:

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

输入输出样例

输入样例:

4 3 64
Fax
fax
max
mac

输出样例:

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

思路

\(Hash\) 是真的强,比 \(kmp\) 好玩多了。 --Uranus

那肯定啦。 --alecli

这是一道字符串哈希的题。考虑如果题目问的不是“相似字符串”而是“相同字符串”,那么可以直接用字符串哈希来解决这一问题。而既然所有字符串的长度相同,考虑枚举相似字符串的不同位,把它去掉,然后比较剩下的字符串是否相同就好了。

利用字符串哈希的话,只需要求一遍所有字符串前缀的哈希值,再反着跑一遍,求后缀的哈希值,每次合并前缀和后缀就好了。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const ULL Pa=131;
const ULL Pb=137;
ULL n,l,s,ans,aHash[30005][205],bHash[30005][205],tmp[30005];
string str;
int main()
{
cin>>n>>l>>s;
for(ULL i=0;i<n;i++)
{
cin>>str;
str='0'+str;
for(ULL j=1;j<=l;j++) aHash[i][j]=aHash[i][j-1]*Pa+str[j];
for(ULL j=l;j;j--) bHash[i][j]=bHash[i][j+1]*Pb+str[j];
}
for(ULL i=1;i<=l;i++)
{
for(ULL j=0;j<n;j++) tmp[j]=aHash[j][i-1]*139+bHash[j][i+1]*149;
sort(tmp,tmp+n);
int now=0;
for(ULL j=0;j<n-1;j++)
if(tmp[j]==tmp[j+1]) ans+=(++now);
else now=0;
}
cout<<ans;
return 0;
}

Luogu P4503 [CTSC2014]企鹅QQ(字符串哈希)的更多相关文章

  1. BZOJ 3555: [Ctsc2014]企鹅QQ [字符串哈希]【学习笔记】

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2046  Solved: 749[Submit][Statu ...

  2. bzoj3555 [Ctsc2014]企鹅QQ——字符串哈希

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3555 很久以前就讲过哈希,但一直没写过题,所以这是哈希第一题! 哈希就是把一个字符串映射成一 ...

  3. Luogu P4503 [CTSC2014]企鹅QQ

    思路 如果直接暴力的比较的话,不用想也知道会超时 所以考虑另一种方法,将前缀和的思想运用到hash中.用两个hash,一个从前往后记录,一个从后往前记录,然后枚举哪一位是不相同的,然后删掉这一位,将这 ...

  4. 【题解】P4503 [CTSC2014]企鹅QQ(哈希)

    [题解]P4503 [CTSC2014]企鹅QQ(哈希) 考虑这样一种做法,将每个字符串的删去某个字符的新字符串的哈希值存下来,然后最后\(sort\)一遍双指针统计每个值相同的数的个数\(x\),这 ...

  5. 洛谷 P4503 [CTSC2014]企鹅QQ 解题报告

    P4503 [CTSC2014]企鹅QQ 题目背景 PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即 ...

  6. 字符串Hash || BZOJ 3555: [Ctsc2014]企鹅QQ || P4503 [CTSC2014]企鹅QQ

    题面:[CTSC2014]企鹅QQ 题解:无 代码: #include<iostream> #include<cstring> #include<cstdio> # ...

  7. 洛谷$P4503\ [CTSC2014]$企鹅$QQ$ 哈希

    正解:哈希 解题报告: 传送门$QwQ$ 直接$O(len)$枚举哪一位,然后把这一位删了重新拼接起来,存桶里查下就成 $over$? 主要的难点大概在卡哈希+卡常$QAQ$ #include< ...

  8. 【BZOJ 3555】 [Ctsc2014]企鹅QQ(哈希)

    Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大 ...

  9. 【bzoj3555】[Ctsc2014]企鹅QQ 简单哈希

    传送门 题目分析 题意即求有多少对字符串只相差一个字符,枚举删除每个字符后的哈希, 看有多少相等即可. 比如有如下字符串:$Sd123$,其中S部分的哈希值为H,删除的是d,则原字符串的哈希值为$$( ...

随机推荐

  1. .net core模糊查询及分页

    在项目文件夹中,创建 PaginatedList类,然后用以下代码替换模板代码. using Microsoft.EntityFrameworkCore; using System; using Sy ...

  2. CSS——div内文字的溢出部分用省略号显示

    使得div内文字的溢出部分用省略号显示,可归纳为两种解决办法,一种方法是用CSS解决,另一种方法是js解决. 一.通过CSS控制显示 div内显示一行,超出部分用省略号显示 div内显示多行,超出部分 ...

  3. 批量处理数据 SqlBulkCopy

    string connectionString = new PublicDBHelper().GetCon(System.Configuration.ConfigurationManager.AppS ...

  4. spring中依赖注入

    理解依赖注入:参考https://blog.csdn.net/taijianyu/article/details/2338311 一.依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编 ...

  5. [JZOJ3177] 【GDOI2013模拟5】安全监控

    题目 描述 (样例都懒得发出来了) 题目大意 给你一个有向图,从111号点出发,绕一圈回来.这一圈中必须经过222号点. 问经过的最少的点数(不重复). 思考历程 一看就觉得是一道神题. 然后仔细观察 ...

  6. 浅谈response和request方法

    一:概述 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. 按这个理解的话一次请求生成一个request和res ...

  7. tty who 命令

    #tty : 查看当前终端对应的终端的设备文件 #who : 查看当前系统登录的所有用户及其信息

  8. Spring框架使用ByName自动注入同名问题剖析

    问题描述   我们在使用spring框架进行项目开发的时候,为了配置Bean的方便经常会使用到Spring当中的Autosire机制,Autowire根据注入规则的不同又可以分为==ByName==和 ...

  9. quatz调度-手动终止线程(1) 创建触发器,线程执行完毕后添加到cleaner list

    import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException;impor ...

  10. WinForm中Dispose()和Close()的区别

    WinForm中Dispose()和Close()的区别 Close()会自动调用Dispose()方法,但是如果窗体是模态的,则不会调用 所以ShowDialog的时候,要用Dispose(),Sh ...