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

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

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. ubuntu使用su切换root用户提示“认证失败”

    在虚拟机上安装了ubuntu,安装时提示设置密码,也设置了,但是在终端操作时,遇到权限不够的问题,于是就想到就是要切换root用户,获取最高权限. 当我使用 su 切换到root用户时,提示我输入密码 ...

  2. 线段树模板 CDOJ1057

    UESTCOJ不知道为什么进不去了哇 跟着叉姐的算法讲堂写的板子 叉姐的思路真的好清晰啊,一定是练习的多并且理解的够深了 希望自己也可以每天进步一点点吧 代码: #include <map> ...

  3. python 一些乱七八糟的东西

    import random import os import sys import re class _is: def __init__(self,reg): self.cr=re.compile(r ...

  4. docker compose,link,Odoo

    1.报错: /usr/bin/docker-current: Error response from daemon: driver failed programming external connec ...

  5. 如何去掉Json字符串中反斜杠

    做项目的时候,遇到了这样的问题,前台传来的Json字符串在实体类中不对应(无法转换为实体类),而且传来的数据项是跟着数据库中的表的变动而变动的(不能重写实体类). 前台Json字符串为: string ...

  6. LOJ tangjz的背包

    题目大意 有 \(n\) 个物品, 第 \(i\) 个物品的体积为 \(i\) 令 \(f(x)\) 为 选择 \(m\) 个物品, 体积和为 \(x\) 的方案数 令 \(V = \sum_{i=1 ...

  7. python3 闭包函数,装饰器

    闭包函数: 1.定义在函数内部的函数 2.包含对外部作用域而非全局作用域的引用特点: 1.自带作用域 2.延迟计算(取到内存地址,加括号执行) def 外部函数(func): def 内部函数(*ar ...

  8. 我的一次安装oracle的过程

    1.在装oracle之前,先安装.net3.5 2.然后正常安装oracle,一直next 3.装完oracle后,安装plsql dev工具,打开工具,发现没有connect as,是需要进行一些配 ...

  9. JDK 动态代理 源码简单分析

    代理的作用就是在访问真实对象之前或者之后可以额外加入一些操作. JDK  的动态代理 只需要 5 步. 真实对象必须要实现接口,首先创建一个接口 public interface HelloWorld ...

  10. 区块链开发(四)Nodejs下载&安装

    以太坊框架truffle的安装需要依赖nodejs中的npm命令,本篇博客我们就简单介绍一下node的安装过程.操作系统基于ubuntu 16.04版本. 下载地址 nodejs官网:http://w ...