菜到自闭,一道省选小水题都能给我做繁。

要求有一位不同,则对每个串每一位暴力枚举把这一位删掉,放一个分隔符,算一下hash,插表,相似的都应该会被插入同一个桶。最后把hash统计一下即可。复杂度$O(nL)$。

但是除了我以外的所有人全是把hash算好丢数组里排序,然后相似的串hash必连在一起。复杂度$O(nLlognL)$,吊打前者。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #define dbg(x) cerr << #x << " = " << x <<endl
  8. using namespace std;
  9. typedef long long ll;
  10. typedef unsigned long long ull;
  11. typedef double db;
  12. typedef pair<int,int> pii;
  13. template<typename T>inline T _min(T A,T B){return A<B?A:B;}
  14. template<typename T>inline T _max(T A,T B){return A>B?A:B;}
  15. template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
  16. template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
  17. template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
  18. template<typename T>inline T read(T&x){
  19. x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
  20. while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
  21. }
  22. const ull base1=;
  23. const int P=,MOD=;
  24. const int N=+,L=+;
  25. char s[L];
  26. ull H1,bek1;
  27. int n,l,siz,len;
  28. struct HASH{
  29. ull ha1[MOD];int Head[MOD],nxt[MOD],cnt[MOD],tot;
  30. inline void Insert(ull x){
  31. int tmp=x%MOD,id=;
  32. for(int j=Head[tmp];j;j=nxt[j])if(x==ha1[j]){id=j;break;}
  33. if(!id)ha1[++tot]=x,nxt[tot]=Head[tmp],Head[tmp]=id=tot;
  34. ++cnt[id];
  35. }
  36. inline int Count(){
  37. int ret=;
  38. for(register int i=;i<=tot;++i)ret+=cnt[i]*(cnt[i]-)/;
  39. return ret;
  40. }
  41. }H;
  42.  
  43. inline void read_data(){
  44. for(register int i=;i<=n;++i){
  45. scanf("%s",s+);
  46. H1=;bek1=;
  47. for(register int j=;j<=l;++j)H1=H1*base1+(s[j]-);
  48. for(register int j=l;j;--j,bek1*=base1)
  49. H.Insert(H1-(s[j]-)*bek1);
  50. }
  51. }
  52.  
  53. int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
  54. read(n),read(l),read(siz);
  55. read_data();
  56. return printf("%d\n",H.Count()),;
  57. }

hash查表

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #define dbg(x) cerr << #x << " = " << x <<endl
  8. using namespace std;
  9. typedef long long ll;
  10. typedef unsigned long long ull;
  11. typedef double db;
  12. typedef pair<int,int> pii;
  13. template<typename T>inline T _min(T A,T B){return A<B?A:B;}
  14. template<typename T>inline T _max(T A,T B){return A>B?A:B;}
  15. template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
  16. template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
  17. template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
  18. template<typename T>inline T read(T&x){
  19. x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
  20. while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
  21. }
  22. const ull base1=;
  23. const int MOD=;
  24. const int N=+,L=+;
  25. char s[L];
  26. ull H1,bek1,ha[MOD];
  27. int n,l,siz,len,ans,cnt,tot;
  28. inline void read_data(){
  29. for(register int i=;i<=n;++i){
  30. scanf("%s",s+);
  31. H1=;bek1=;
  32. for(register int j=;j<=l;++j)H1=H1*base1+(s[j]-);
  33. for(register int j=l;j;--j,bek1*=base1)
  34. ha[++tot]=H1-(s[j]-)*bek1;
  35. }
  36. }
  37.  
  38. int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
  39. read(n),read(l),read(siz);
  40. read_data();
  41. sort(ha+,ha+tot+);
  42. ha[]=ha[]-;
  43. for(register int i=;i<=tot+;++i)ha[i]^ha[i-]?(ans+=(cnt*(cnt-))>>,cnt=):++cnt;
  44. printf("%d\n",ans);
  45. return ;
  46. }

暴力sort

BZOJ3555 [Ctsc2014]企鹅QQ[暴力+字符串hash]的更多相关文章

  1. 【题解】 bzoj3555: [Ctsc2014]企鹅QQ (字符串Hash)

    题面戳我 Solution 我们分析题意,他要求的是两个字符串只有一个字符不同,然后我们再看长度\(L \leq 200\),显然我们就可以把每一位删除后\(Hash\),然后判断相同个数即可 我一开 ...

  2. 【BZOJ3555】企鹅QQ(字符串哈希)

    [BZOJ3555]企鹅QQ(字符串哈希) 题面 BZOJ 题解 把前缀哈希一下,后缀哈希一下 枚举哪个位置不选,然后检查一下相同就行了.. 为什么我的\(Hash\)老是\(WA\), 为什么\(Z ...

  3. bzoj3555: [Ctsc2014]企鹅QQ

    将字符串hash.不难写.然而1.注意用longlong2.数组大小注意...3.似乎别人都用的unsigned long long ?. #include<cstdio> #includ ...

  4. BZOJ3555 [Ctsc2014]企鹅QQ 【hash】

    题目 PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验, ...

  5. bzoj3555: [Ctsc2014]企鹅QQ (Hash)

    枚举每个分段的点,每次O(n)更新左边和右边的hash值 然后用双指针O(n)计算答案 #include<stdio.h> #include<string.h> #includ ...

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

    枚举每个位置,给每个串的前半部分一个哈希值,后半部分一个哈希值,若是它们均相等,则视为这两个串相似. 每次转移之后,排序一下就行了. O(L*n*log(n)). #include<cstdio ...

  7. [BZOJ3555] [Ctsc2014]企鹅QQ(Hash)

    传送门 可以枚举被删除的位置,然后用hash表判重,然而网上好多题解都是用 sort 判重的. 不知道为什么,int 总是过不了,换成 long long 或者是 unsigned long long ...

  8. bzoj3555 [Ctsc2014]企鹅QQ——字符串哈希

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3555 很久以前就讲过哈希,但一直没写过题,所以这是哈希第一题! 哈希就是把一个字符串映射成一 ...

  9. BZOJ3555 [Ctsc2014]企鹅QQ 题解

    题目大意: 有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数. 思路: Hash大法好!正着倒着各来一遍(底数不同),之后枚举不同的那一位,前后两段拼起来之后为了有区分前面一部分再乘一个数 ...

随机推荐

  1. uni-app编译配置

    Uni-app 编译配置 <!-- #ifdef H5 --> <view>只在H5编译</view> <!-- #endif --> <!-- ...

  2. Java字节流文件封装

     /**  * 字节流封装方法  */ import java.io.FileInputStream; import java.io.FileNotFoundException; import jav ...

  3. 自己总结的keepalived的配置流程以及注意事项

    编写背景:上班时领导要求我们团队实现postgresql主备切换的高可用问题,我辅助keepalived的部分,从查资料到实施最后使用,最后编写了这个博客,水平有限,欢迎大家指正 ###postgre ...

  4. JavaSE 基础

    一.Java 面向对象 1. 面向对象都有哪些特性以及 你对这些特性的理解 1.1. 继承: 继承是从已有类得到继承信息创建新类的过程. 提供继承信息的类被称为父类(超类,基类);得到继承信息的类被称 ...

  5. 什么是数据传输服务DTS

    数据传输服务(Data Transmission Service) DTS支持关系型数据库.NoSQL.大数据(OLAP)等数据源间的数据传输. 它是一种集数据迁移.数据订阅及数据实时同步于一体的数据 ...

  6. 【pytorch】学习笔记(二)- Variable

    [pytorch]学习笔记(二)- Variable 学习链接自莫烦python 什么是Variable Variable就好像一个篮子,里面装着鸡蛋(Torch 的 Tensor),里面的鸡蛋数不断 ...

  7. Django发送邮件和itsdangerous模块的配合使用

    项目需求:用户注册页面注册之后,系统会发送一封邮件到用户邮箱,用户点击链接以激活账户,其中链接中的用户信息需要加密处理一下 其中激活自己邮箱的smtp服务的操作就不在加以说明,菜鸟教程上有非常清晰的讲 ...

  8. Django之cookie与session、中间件

    目录 cookie与session 为什么会有cookie和session cookie 设置cookie 获取cookie 删除cookie 实例:cookie版登录校验 session 设置ses ...

  9. 如何让 node 运行 es6 模块文件,及其原理

    如何让 node 运行 es6 模块文件,及其原理 最新版的 node 支持最新版 ECMAScript 几乎所有特性,但有一个特性却一直到现在都还没有支持,那就是从 ES2015 开始定义的模块化机 ...

  10. etcd集群安装

    etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点:1.简单:相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过gRPC提 ...