枚举每个位置,给每个串的前半部分一个哈希值,后半部分一个哈希值,若是它们均相等,则视为这两个串相似。

每次转移之后,排序一下就行了。

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的更多相关文章

  1. bzoj3555: [Ctsc2014]企鹅QQ

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

  2. 字符串Hash || BZOJ 3555: [Ctsc2014]企鹅QQ || P4503 [CTSC2014]企鹅QQ

    题面:[CTSC2014]企鹅QQ 题解:无 代码: #include<iostream> #include<cstring> #include<cstdio> # ...

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

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

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

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

  5. BZOJ3555 [Ctsc2014]企鹅QQ[暴力+字符串hash]

    菜到自闭,一道省选小水题都能给我做繁. 要求有一位不同,则对每个串每一位暴力枚举把这一位删掉,放一个分隔符,算一下hash,插表,相似的都应该会被插入同一个桶.最后把hash统计一下即可.复杂度$O( ...

  6. BZOJ3555 [Ctsc2014]企鹅QQ 题解

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

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

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

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

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

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

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

随机推荐

  1. [hdu 4734]数位dp例题

    通过这个题目更加深入了解到了数位dp在记忆化搜索的过程中就是实现了没有限制条件的n位数的状态复用. #include<bits/stdc++.h> using namespace std; ...

  2. SICAU-OJ: A|B

    A|B 题意: 给出一个整数n(1<=n<=10100),求Σd(d满足d可以整除n),同时保证不存在x^2有x^2可以整除n. 另外,n的质因子满足小于等于1000. 题解: 这题是我第 ...

  3. HDU3488:Tour(KM算法)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  4. Endnote 中文参考文献样式修改版

    http://blog.yuelong.info/post/endnote-gbt7714-2005.html 很多人不知道 EndNote 是自带中文参考文献引用样式的,即符合<文后参考文献著 ...

  5. SEH

    @author: dlive SEH是Windows的异常处理机制,在程序源代码中使用__try,__catch,__finally关键字来具体实现. 但SEH与C++的try, catch异常处理不 ...

  6. python自带的线程池和进程池

    #python自带的线程池 from multiprocessing.pool import ThreadPool #注意ThreadPool不在threading模块下 from multiproc ...

  7. GUI自动化模块化实现方式

    效率为王:脚本与数据的解耦 + Page Object模型 1.数据驱动:实现了“测试脚本和数据的解耦”,数据驱动测试的数据文件中不仅可以包含测试输入数据,还可以包含测试验证结果数据,甚至可以包含测试 ...

  8. Oracle rman 全备份的一个小例子

    run{  allocate channel d1 type disk;  backup database format='/u01/backup/%T_%d_%s.bak';  sql 'alter ...

  9. Spark优化之一:分布式下的map操作是闭包

    例如对一个JavaPairRDD<String, String>做遍历操作,常见的,我们可以通过先通过collect()操作将它转化为Map对象再进行遍历,也可以使用Spark提供的map ...

  10. Java坦克大战 (三) 之可完全控制坦克朝八个方向运动

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...