[洛谷P4503][CTSC2014]企鹅QQ
题目大意:给你$n(n\leqslant3\times10^4)$个长度为$l(l\leqslant200)$的字符串,要你求出有多少对字符串是相似的,相似的定义是两个字符串只在一位上不同。
题解:可以对每一位求出去掉这一位后的字符串$hash$值,发现直接算可能有点烦,考虑异或的自反性($a\oplus b\oplus a=b$),可以在$hash$时把每一位的结果异或起来,求扣除一位的$hash$值时只需要再异或上这一位即可。
用异或的话,需要给每一位一个权值,可以直接$rand$求出。
最后给存扣除每一位的数组排一个序,找其中相同的元素个数即可。
卡点:无
C++ Code:
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <vector>
#define maxn 30010
#define maxl 210 inline unsigned long long randllu() { return static_cast<unsigned long long> (rand()); }
inline unsigned long long RAND() {
return randllu() << 48 ^ randllu() << 32 ^ randllu() << 16 ^ randllu();
} int n, l, ans;
unsigned long long len[256], str[256];
std::vector<unsigned long long> v[maxl];
int main() {
srand(20040826);
scanf("%d%d%*d", &n, &l);
for (int i = 0; i < 256; ++i) {
len[i] = RAND();
str[i] = RAND();
}
for (int i = 1; i <= n; ++i) {
static char s[maxl];
scanf("%s", s);
unsigned long long hsh = 0;
for (int i = 0; i < l; ++i) hsh ^= len[i] * str[s[i]];
for (int i = 0; i < l; ++i) v[i].push_back(hsh ^ len[i] * str[s[i]]);
}
for (int len = 0; len < l; ++len) {
std::vector<unsigned long long> &V = v[len];
std::sort(V.begin(), V.end());
for (std::vector<unsigned long long>::iterator l = V.begin(); l != V.end(); ) {
unsigned long long ch = *l;
int now = 0;
while (l != V.end() && *l == ch) ++l, ans += now++;
}
}
printf("%d\n", ans);
return 0;
}
[洛谷P4503][CTSC2014]企鹅QQ的更多相关文章
- 洛谷 P4503 [CTSC2014]企鹅QQ 解题报告
P4503 [CTSC2014]企鹅QQ 题目背景 PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即 ...
- 洛谷 P4503 [CTSC2014]企鹅QQ
暴力枚举不同的一位即可.. 主要是常数问题 1.统计答案时用sort速度快于用tr1/unordered_map,后者又快于map (tr1/unordered_map完全达不到理论复杂度上的O(1) ...
- 洛谷$P4503\ [CTSC2014]$企鹅$QQ$ 哈希
正解:哈希 解题报告: 传送门$QwQ$ 直接$O(len)$枚举哪一位,然后把这一位删了重新拼接起来,存桶里查下就成 $over$? 主要的难点大概在卡哈希+卡常$QAQ$ #include< ...
- Luogu P4503 [CTSC2014]企鹅QQ(字符串哈希)
P4503 [CTSC2014]企鹅QQ 题面 题目背景 \(PenguinQQ\) 是中国最大.最具影响力的 \(SNS(Social Networking Services)\) 网站,以实名制为 ...
- 【题解】P4503 [CTSC2014]企鹅QQ(哈希)
[题解]P4503 [CTSC2014]企鹅QQ(哈希) 考虑这样一种做法,将每个字符串的删去某个字符的新字符串的哈希值存下来,然后最后\(sort\)一遍双指针统计每个值相同的数的个数\(x\),这 ...
- 字符串Hash || BZOJ 3555: [Ctsc2014]企鹅QQ || P4503 [CTSC2014]企鹅QQ
题面:[CTSC2014]企鹅QQ 题解:无 代码: #include<iostream> #include<cstring> #include<cstdio> # ...
- Luogu P4503 [CTSC2014]企鹅QQ
思路 如果直接暴力的比较的话,不用想也知道会超时 所以考虑另一种方法,将前缀和的思想运用到hash中.用两个hash,一个从前往后记录,一个从后往前记录,然后枚举哪一位是不相同的,然后删掉这一位,将这 ...
- BZOJ 3555: [Ctsc2014]企鹅QQ [字符串哈希]【学习笔记】
3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2046 Solved: 749[Submit][Statu ...
- bzoj3555: [Ctsc2014]企鹅QQ
将字符串hash.不难写.然而1.注意用longlong2.数组大小注意...3.似乎别人都用的unsigned long long ?. #include<cstdio> #includ ...
随机推荐
- JS Windows.document对象
四中选择器:class ,id , name , 标签 通过选择器获取对象: ...................................ClassName(''); -- class选择 ...
- javaweb(七)——HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- tensorflow中tensor与数组之间的转换
# 主要是两个方法: # 1.数组转tensor:数组a, tensor_a=tf.convert_to_tensor(a) # 2.tensor转数组:tensor b, array_b=b.eva ...
- socket编程为什么需要htonl(), ntohl(), ntohs(),htons() 函数-------转载
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...
- ZT-----用javascrip写一个区块链
几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术.在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的.我将会称之 ...
- RyuBook1.0案例三:REST Linkage
REST Linkage 该小结主要介绍如何添加一个REST Link 函数 RYU本身提供了一个类似WSGI的web服务器功能.借助这个功能,我们可以创建一个REST API. 基于创建的REST ...
- sklearn中的交叉验证(Cross-Validation)
这个repo 用来记录一些python技巧.书籍.学习链接等,欢迎stargithub地址sklearn是利用python进行机器学习中一个非常全面和好用的第三方库,用过的都说好.今天主要记录一下sk ...
- PytorchZerotoAll学习笔记(二)--梯度下降之手动求导
梯度下降算法: 待优化的损失值为 loss,那么我们希望预测的值能够很接近真实的值 y_pred ≍ y_label 我们的样本有n个,那么损失值可以由一下公式计算得出: 要使得los ...
- curl常用用法
-v显示请求详细信息 curl www.baidu.com -v -X 指定请求方式 GET请求 curl -X GET http://localhost:8080/search?data=123 # ...
- USACO 2.3.3 Zero Sum 和为零(深搜枚举)
Description 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将 ...