bzoj3555: [Ctsc2014]企鹅QQ (Hash)

枚举每个分段的点,每次O(n)更新左边和右边的hash值

然后用双指针O(n)计算答案

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<iostream>
 5 #define ull unsigned long long
 6 using namespace std;
 7 struct HS{
 8     ull l,r;
 9 }tmp[30010],hs[30010];
10 ull base,b[202],c[301];
11 int n,m;
12 char s[30010][203];
13
14 bool cmp(HS a, HS b){
15     if (a.l==b.l) return a.r<b.r; return a.l<b.l;
16 }
17
18 bool operator!=(HS a, HS b){
19     return ((a.l!=b.l) || (a.r!=b.r));
20 }
21
22 void pre(){
23     if (base==2) c[‘0‘]=1,c[‘1‘]=2;
24     else{
25         int cnt=0;
26         for (int i=‘A‘; i<=‘Z‘; i++) c[i]=++cnt;
27         for (int i=‘a‘; i<=‘z‘; i++) c[i]=++cnt;
28         for (int i=‘0‘; i<=‘9‘; i++) c[i]=++cnt;
29         c[‘_‘]=++cnt; c[‘@‘]=++cnt;
30     }
31     ++base; b[0]=1;
32     for (int i=1; i<=m; i++) b[i]=b[i-1]*base;
33 }
34
35 int main(){
36     scanf("%d%d", &n, &m); cin>>base;
37     pre();
38     for (int i=1; i<=n; i++){
39         scanf("%s", s[i]+1);
40         for (int j=2; j<=m; j++)
41             hs[i].r=hs[i].r*base+(ull)c[s[i][j]];
42     }
43     memcpy(tmp,hs,(n+1)*sizeof(HS));
44     ull ans=0LL;
45     for (int i=2; i<=m+1; i++){
46         int head=0;
47         sort(hs+1,hs+1+n,cmp);
48         for (int j=1; j<=n; j++){
49             tmp[j].l=tmp[j].l*base+c[s[j][i-1]];
50             tmp[j].r-=b[m-i]*c[s[j][i]];
51             if (j==1 || hs[j]!=hs[j-1]) head=j;
52             if (j==n || hs[j]!=hs[j+1]) ans+=(ull)(j-head)*(j-head+1)/2;
53         }
54         memcpy(hs,tmp,(n+1)*sizeof(HS));
55     }
56     cout<<ans<<endl;
57     return 0;
58 } 
时间: 2024-10-23 10:27:56

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

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

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)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用户对社交.资讯.娱乐.交易等多方面的需

BZOJ3555 [Ctsc2014]企鹅QQ 【hash】

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

BZOJ3555 [Ctsc2014]企鹅QQ 题解

题目大意: 有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数. 思路: Hash大法好!正着倒着各来一遍(底数不同),之后枚举不同的那一位,前后两段拼起来之后为了有区分前面一部分再乘一个数.模数用unsigned long long自然溢出. 代码: 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 const int S1=1007,

【字符串哈希】bzoj3555 [Ctsc2014]企鹅QQ

枚举每个位置,给每个串的前半部分一个哈希值,后半部分一个哈希值,若是它们均相等,则视为这两个串相似. 每次转移之后,排序一下就行了. O(L*n*log(n)). #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; typedef unsigned long long ull; struct HASH{ull l,r;}h

[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

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