BZOJ3555 [Ctsc2014]企鹅QQ[暴力+字符串hash]
菜到自闭,一道省选小水题都能给我做繁。
要求有一位不同,则对每个串每一位暴力枚举把这一位删掉,放一个分隔符,算一下hash,插表,相似的都应该会被插入同一个桶。最后把hash统计一下即可。复杂度$O(nL)$。
但是除了我以外的所有人全是把hash算好丢数组里排序,然后相似的串hash必连在一起。复杂度$O(nLlognL)$,吊打前者。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<queue>
- #define dbg(x) cerr << #x << " = " << x <<endl
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef double db;
- typedef pair<int,int> pii;
- template<typename T>inline T _min(T A,T B){return A<B?A:B;}
- template<typename T>inline T _max(T A,T B){return A>B?A:B;}
- template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
- template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
- template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
- template<typename T>inline T read(T&x){
- x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
- while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
- }
- const ull base1=;
- const int P=,MOD=;
- const int N=+,L=+;
- char s[L];
- ull H1,bek1;
- int n,l,siz,len;
- struct HASH{
- ull ha1[MOD];int Head[MOD],nxt[MOD],cnt[MOD],tot;
- inline void Insert(ull x){
- int tmp=x%MOD,id=;
- for(int j=Head[tmp];j;j=nxt[j])if(x==ha1[j]){id=j;break;}
- if(!id)ha1[++tot]=x,nxt[tot]=Head[tmp],Head[tmp]=id=tot;
- ++cnt[id];
- }
- inline int Count(){
- int ret=;
- for(register int i=;i<=tot;++i)ret+=cnt[i]*(cnt[i]-)/;
- return ret;
- }
- }H;
- inline void read_data(){
- for(register int i=;i<=n;++i){
- scanf("%s",s+);
- H1=;bek1=;
- for(register int j=;j<=l;++j)H1=H1*base1+(s[j]-);
- for(register int j=l;j;--j,bek1*=base1)
- H.Insert(H1-(s[j]-)*bek1);
- }
- }
- int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
- read(n),read(l),read(siz);
- read_data();
- return printf("%d\n",H.Count()),;
- }
hash查表
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<queue>
- #define dbg(x) cerr << #x << " = " << x <<endl
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef double db;
- typedef pair<int,int> pii;
- template<typename T>inline T _min(T A,T B){return A<B?A:B;}
- template<typename T>inline T _max(T A,T B){return A>B?A:B;}
- template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
- template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
- template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
- template<typename T>inline T read(T&x){
- x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
- while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
- }
- const ull base1=;
- const int MOD=;
- const int N=+,L=+;
- char s[L];
- ull H1,bek1,ha[MOD];
- int n,l,siz,len,ans,cnt,tot;
- inline void read_data(){
- for(register int i=;i<=n;++i){
- scanf("%s",s+);
- H1=;bek1=;
- for(register int j=;j<=l;++j)H1=H1*base1+(s[j]-);
- for(register int j=l;j;--j,bek1*=base1)
- ha[++tot]=H1-(s[j]-)*bek1;
- }
- }
- int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
- read(n),read(l),read(siz);
- read_data();
- sort(ha+,ha+tot+);
- ha[]=ha[]-;
- for(register int i=;i<=tot+;++i)ha[i]^ha[i-]?(ans+=(cnt*(cnt-))>>,cnt=):++cnt;
- printf("%d\n",ans);
- return ;
- }
暴力sort
BZOJ3555 [Ctsc2014]企鹅QQ[暴力+字符串hash]的更多相关文章
- 【题解】 bzoj3555: [Ctsc2014]企鹅QQ (字符串Hash)
题面戳我 Solution 我们分析题意,他要求的是两个字符串只有一个字符不同,然后我们再看长度\(L \leq 200\),显然我们就可以把每一位删除后\(Hash\),然后判断相同个数即可 我一开 ...
- 【BZOJ3555】企鹅QQ(字符串哈希)
[BZOJ3555]企鹅QQ(字符串哈希) 题面 BZOJ 题解 把前缀哈希一下,后缀哈希一下 枚举哪个位置不选,然后检查一下相同就行了.. 为什么我的\(Hash\)老是\(WA\), 为什么\(Z ...
- bzoj3555: [Ctsc2014]企鹅QQ
将字符串hash.不难写.然而1.注意用longlong2.数组大小注意...3.似乎别人都用的unsigned long long ?. #include<cstdio> #includ ...
- 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
枚举每个位置,给每个串的前半部分一个哈希值,后半部分一个哈希值,若是它们均相等,则视为这两个串相似. 每次转移之后,排序一下就行了. O(L*n*log(n)). #include<cstdio ...
- [BZOJ3555] [Ctsc2014]企鹅QQ(Hash)
传送门 可以枚举被删除的位置,然后用hash表判重,然而网上好多题解都是用 sort 判重的. 不知道为什么,int 总是过不了,换成 long long 或者是 unsigned long long ...
- bzoj3555 [Ctsc2014]企鹅QQ——字符串哈希
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3555 很久以前就讲过哈希,但一直没写过题,所以这是哈希第一题! 哈希就是把一个字符串映射成一 ...
- BZOJ3555 [Ctsc2014]企鹅QQ 题解
题目大意: 有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数. 思路: Hash大法好!正着倒着各来一遍(底数不同),之后枚举不同的那一位,前后两段拼起来之后为了有区分前面一部分再乘一个数 ...
随机推荐
- uni-app编译配置
Uni-app 编译配置 <!-- #ifdef H5 --> <view>只在H5编译</view> <!-- #endif --> <!-- ...
- Java字节流文件封装
/** * 字节流封装方法 */ import java.io.FileInputStream; import java.io.FileNotFoundException; import jav ...
- 自己总结的keepalived的配置流程以及注意事项
编写背景:上班时领导要求我们团队实现postgresql主备切换的高可用问题,我辅助keepalived的部分,从查资料到实施最后使用,最后编写了这个博客,水平有限,欢迎大家指正 ###postgre ...
- JavaSE 基础
一.Java 面向对象 1. 面向对象都有哪些特性以及 你对这些特性的理解 1.1. 继承: 继承是从已有类得到继承信息创建新类的过程. 提供继承信息的类被称为父类(超类,基类);得到继承信息的类被称 ...
- 什么是数据传输服务DTS
数据传输服务(Data Transmission Service) DTS支持关系型数据库.NoSQL.大数据(OLAP)等数据源间的数据传输. 它是一种集数据迁移.数据订阅及数据实时同步于一体的数据 ...
- 【pytorch】学习笔记(二)- Variable
[pytorch]学习笔记(二)- Variable 学习链接自莫烦python 什么是Variable Variable就好像一个篮子,里面装着鸡蛋(Torch 的 Tensor),里面的鸡蛋数不断 ...
- Django发送邮件和itsdangerous模块的配合使用
项目需求:用户注册页面注册之后,系统会发送一封邮件到用户邮箱,用户点击链接以激活账户,其中链接中的用户信息需要加密处理一下 其中激活自己邮箱的smtp服务的操作就不在加以说明,菜鸟教程上有非常清晰的讲 ...
- Django之cookie与session、中间件
目录 cookie与session 为什么会有cookie和session cookie 设置cookie 获取cookie 删除cookie 实例:cookie版登录校验 session 设置ses ...
- 如何让 node 运行 es6 模块文件,及其原理
如何让 node 运行 es6 模块文件,及其原理 最新版的 node 支持最新版 ECMAScript 几乎所有特性,但有一个特性却一直到现在都还没有支持,那就是从 ES2015 开始定义的模块化机 ...
- etcd集群安装
etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点:1.简单:相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过gRPC提 ...