【字符串哈希】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;}hss[30001],tmp[30001];
- bool operator < (const HASH &a,const HASH &b){return a.l!=b.l ? a.l<b.l : a.r<b.r;}
- bool operator != (const HASH &a,const HASH &b){return (a.l!=b.l||a.r!=b.r);}
- ull seed,seeds[201];
- int ord[301],n,m,ans;
- char s[30001][201];
- void init()
- {
- if(seed==2) ord['0']=1,ord['1']=2;
- else
- {
- int en=0;
- for(char c='A';c<='Z';++c) ord[c]=++en;
- for(char c='a';c<='z';++c) ord[c]=++en;
- for(char c='0';c<='9';++c) ord[c]=++en;
- ord['_']=++en; ord['@']=++en;
- }
- ++seed; seeds[0]=1;
- for(int i=1;i<=m;++i)
- seeds[i]=seeds[i-1]*seed;
- }
- int main()
- {
- scanf("%d%d",&n,&m); cin>>seed;
- init();
- for(int i=1;i<=n;++i)
- {
- scanf("%s",s[i]);
- for(int j=1;j<m;++j)
- hss[i].r=hss[i].r*seed+(ull)ord[s[i][j]];
- }
- memcpy(tmp,hss,(n+1)*sizeof(HASH));
- for(int i=1;i<=m;++i)
- {
- int head;
- sort(hss+1,hss+n+1);
- for(int j=1;j<=n;++j)
- {
- tmp[j].l=tmp[j].l*seed+(ull)ord[s[j][i-1]];
- tmp[j].r-=seeds[m-1-i]*(ull)ord[s[j][i]];
- if(j==1 || hss[j]!=hss[j-1]) head=j;
- if(j==n || hss[j]!=hss[j+1]) ans+=(((j-head+1)*(j-head))>>1);
- }
- memcpy(hss,tmp,(n+1)*sizeof(HASH));
- }
- printf("%d\n",ans);
- return 0;
- }
【字符串哈希】bzoj3555 [Ctsc2014]企鹅QQ的更多相关文章
- bzoj3555: [Ctsc2014]企鹅QQ
将字符串hash.不难写.然而1.注意用longlong2.数组大小注意...3.似乎别人都用的unsigned long long ?. #include<cstdio> #includ ...
- 字符串Hash || BZOJ 3555: [Ctsc2014]企鹅QQ || P4503 [CTSC2014]企鹅QQ
题面:[CTSC2014]企鹅QQ 题解:无 代码: #include<iostream> #include<cstring> #include<cstdio> # ...
- bzoj3555 [Ctsc2014]企鹅QQ——字符串哈希
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3555 很久以前就讲过哈希,但一直没写过题,所以这是哈希第一题! 哈希就是把一个字符串映射成一 ...
- 【题解】 bzoj3555: [Ctsc2014]企鹅QQ (字符串Hash)
题面戳我 Solution 我们分析题意,他要求的是两个字符串只有一个字符不同,然后我们再看长度\(L \leq 200\),显然我们就可以把每一位删除后\(Hash\),然后判断相同个数即可 我一开 ...
- BZOJ3555 [Ctsc2014]企鹅QQ[暴力+字符串hash]
菜到自闭,一道省选小水题都能给我做繁. 要求有一位不同,则对每个串每一位暴力枚举把这一位删掉,放一个分隔符,算一下hash,插表,相似的都应该会被插入同一个桶.最后把hash统计一下即可.复杂度$O( ...
- BZOJ3555 [Ctsc2014]企鹅QQ 题解
题目大意: 有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数. 思路: Hash大法好!正着倒着各来一遍(底数不同),之后枚举不同的那一位,前后两段拼起来之后为了有区分前面一部分再乘一个数 ...
- BZOJ3555 [Ctsc2014]企鹅QQ 【hash】
题目 PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验, ...
- bzoj3555: [Ctsc2014]企鹅QQ (Hash)
枚举每个分段的点,每次O(n)更新左边和右边的hash值 然后用双指针O(n)计算答案 #include<stdio.h> #include<string.h> #includ ...
- [BZOJ3555] [Ctsc2014]企鹅QQ(Hash)
传送门 可以枚举被删除的位置,然后用hash表判重,然而网上好多题解都是用 sort 判重的. 不知道为什么,int 总是过不了,换成 long long 或者是 unsigned long long ...
随机推荐
- 谈一谈深度学习之semantic Segmentation
上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...
- HDU4280:Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- bzoj1251: 序列终结者 fhqtreap写法
fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...
- [bzoj3238][Ahoi2013]差异——后缀自动机
Brief Description Algorithm Design 下面给出后缀自动机的一个性质: 两个子串的最长公共后缀,位于这两个串对应的状态在parent树上的lca状态上.并且最长公共后缀的 ...
- elasticsearch.helpers.ScanError: Scroll request has only succeeded on xx shards
# 当index=''为空时出现此错误
- IPsec传输模式下ESP报文的装包和拆包过程
原创文章,拒绝转载 装包过程 总体流程图 过程描述 在原IP报文中找到TCP报文部分,在其后添加相应的ESP trailer信息. ESP trailer 包含三部分:Padding,Pad leng ...
- ios 里如何处理四舍五入的问题
http://blog.sina.com.cn/s/blog_a2774bb10101293j.html 今天朋友问我一个问题,就是如何只舍不入.比如 float price = 0.126,怎么样才 ...
- Linux下git源码安装【转】
转自:http://blog.csdn.net/u012889638/article/details/51167123 版权声明:本文为博主原创文章,未经博主允许不得转载. 版本信息:CentOS r ...
- Linux makefile 教程 非常详细,且易懂【转】
转自: http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...
- DRF视图集的路由设置
在使用DRF视图集时,往往需要配一大堆路由,例如: # views.py class DepartmentViewSet(ListModelMixin,CreateModelMixin,Retriev ...