[3555] [Ctsc2014]企鹅QQ(Hash)

传送门

可以枚举被删除的位置,然后用hash表判重,然而网上好多题解都是用 sort 判重的。

不知道为什么,int 总是过不了,换成 long long 或者是 unsigned long long 就过了 QAQ

——代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #define ULL unsigned long long
 4 #define M(a, x) memset(a, x, sizeof(a))
 5
 6 const int p = 30011, MAXN = 40001;
 7 int n, m, k, cnt, ans;
 8 int head[MAXN], num[MAXN], next[MAXN];
 9 ULL bit[201], sum[MAXN][201], val[MAXN];
10 char s[MAXN][201];
11
12 inline int insert(ULL x)
13 {
14     int i, a = x % p;
15     for(i = head[a]; i != -1; i = next[i])
16         if(val[i] == x)
17         {
18             num[i]++;
19             return num[i] - 1;
20         }
21     num[cnt]++;
22     val[cnt] = x;
23     next[cnt] = head[a];
24     head[a] = cnt++;
25     return 0;
26 }
27
28 int main()
29 {
30     int i, j;
31     scanf("%d %d %d", &n, &m, &k);
32     bit[0] = 1;
33     for(i = 1; i <= m; i++) bit[i] = bit[i - 1] * 107;
34     for(i = 1; i <= n; i++) scanf("%s", s[i] + 1);
35     for(i = 1; i <= n; i++)
36         for(j = 1; j <= m; j++)
37             sum[i][j] = sum[i][j - 1] * 107 + s[i][j];
38     for(i = 1; i <= m; i++)
39     {
40         cnt = 0;
41         M(head, -1);
42         M(next, 0);
43         M(val, 0);
44         M(num, 0);
45         for(j = 1; j <= n; j++)
46             ans += insert(sum[j][m] - sum[j][i] * bit[m - i] + sum[j][i - 1] * bit[m - i + 1]);
47     }
48     printf("%d\n", ans);
49     return 0;
50 }

时间: 2024-10-10 04:31:21

[3555] [Ctsc2014]企鹅QQ(Hash)的相关文章

BZOJ 3555: [Ctsc2014]企鹅QQ hash

3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=3555 Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用户对社交.资讯.娱乐.交易等多方面的需

bzoj——3555: [Ctsc2014]企鹅QQ

3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2617  Solved: 921[Submit][Status][Discuss] Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用户对社交.资讯.娱乐.交易等多方面的需求.小Q是Pe

Bzoj 3555: [Ctsc2014]企鹅QQ

3555: [Ctsc2014]企鹅QQ Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用户对社交.资讯.娱乐.交易等多方面的需求.小Q是PenguinQQ网站的管理员,他最近在进行一项有趣的研究——哪些账户是同一个人注册的.经过长时间的分析,小Q发现同一个人注册的账户名称总是很相似的,例如Penguin1,Penguin

3555: [Ctsc2014]企鹅QQ

3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 696  Solved: 294[Submit][Status][Discuss] Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用户对社交.资讯.娱乐.交易等多方面的需求.小Q是Pen

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

3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2046  Solved: 749[Submit][Status][Discuss] Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用户对社交.资讯.娱乐.交易等多方面的需求.小Q是Pe

[bzoj3555]企鹅QQ(hash)

3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1645  Solved: 616[Submit][Status][Discuss] Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用户对社交.资讯.娱乐.交易等多方面的需求.小Q是Pe

bzoj3555[Ctsc2014]企鹅QQ

bzoj3555[Ctsc2014]企鹅QQ 题意: 判定有多少对字符串只有一个字母不同.字符串个数≤30000,长度≤300. 题解: 求出第i个字符串前j个字符的哈希值hs[i][j],然后枚举去掉所有字符串的第几位,将去掉后的字符串的哈希值用hs数组直接算出,排序后检查有没有相同的计入答案. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k

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

[题解]P4503 [CTSC2014]企鹅QQ(哈希) 考虑这样一种做法,将每个字符串的删去某个字符的新字符串的哈希值存下来,然后最后\(sort\)一遍双指针统计每个值相同的数的个数\(x\),这个\(x\)对答案的贡献是\({x \choose 2}\) //@winlere #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace

BZOJ 3555 CTSC 2014 企鹅QQ Hash

题目大意:为了分辨那些qq是一个人的小号,我们需要写一套程序来判定哪些名称是相似的.相似的定义是有且只有一个位置的字符不同. 思路:数据范围不算太大,很明显的Hash,二分都不用.听老师说今年去CTSC考试的学长中有一个人没AC这个题是因为想多了.他当时写了Hash,然后闲的没事自己出一组数据卡掉了自己的hash,然后就不敢交hash了,最后交了一个Trie树,结果T了..血的教训告诉我们,不要想太多.. 先预处理每个字符串,得到hash值.然后枚举每一位,在O(1)的时间中吧这一位去掉的Has