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. [课后作业] 第002讲:用Python设计第一个游戏 | 课后测试题

    试题: 0. 什么是BIF? 1. 用课堂上小甲鱼教的方法数一数 Python3 提供了多少个 BIF? 2. 在 Python 看来:'FishC' 和 'fishc' 一样吗? 3. 在小甲鱼看来 ...

  2. JavaScript特效源码(1、文字特效)

    注:本文以及以下关于Javascript特效源码都是分享自JavaScript源码大全. 1.逐隐逐现的的特效 逐隐逐现的文字特效[推荐使用][适用于IE4++] (修改显示的文字后根据说明进行共2步 ...

  3. PCA降维2

    前言 本文为模式识别系列第一篇,主要介绍主成分分析算法(Principal Component Analysis,PCA)的理论,并附上相关代码.全文主要分六个部分展开: 1)简单示例.通过简单的例子 ...

  4. HDU3480 Division——四边形不等式或斜率优化

    题目大意 将N个数分成M部分,使每部分的最大值与最小值平方差的和最小. 思路 首先肯定要将数列排序,每部分一定是取连续的一段,于是就有了方程 $\Large f(i,j)=min(f(i-1,k-1) ...

  5. HTML 排版标记

    <p></p> : 表示一个段落 常用属性 : align : 水平对齐方式  取值 :left  center right 和Word文档一样 : 段落有空行  <br ...

  6. ssh连接Ubuntu之access denied

    解决方法是: 修改/etc/ssh/ssh_config文件, #PermitRootLogin prohibit-password改为PermitRootLogin yes 然后 PasswordA ...

  7. CAS添加验证码功能

    1.  cas.war 下面的web-inf/web.xml  lib添加  kaptcha.jar kaptcha.jar通过maven获取 <dependency> <group ...

  8. Linux 启动dubbo管控台:

  9. 根据url的属性名来取属性值赋值给js

    1.方法一:js的正则表达式:请求路径:http://127.0.0.1/pec/jsp/member/refundOrder.jsp?status=4 <script> var stat ...

  10. codeforces600E. Lomsat gelral(dsu on tree)

    dsu on tree先分轻重儿子先处理轻边,再处理重儿子再加上轻儿子的答案 #include<iostream> #include<cstdio> #include<q ...