【字符串哈希】【哈希表】Aizu - 1370 - Hidden Anagrams
给你两个4k长度的串,问你最长公共子串。两个子串相同被定义为所有字母的出现次数分别相同即可。
就枚举第一个串的所有子串,将字母出现的次数看作一个大数,进行哈希(双关键字),塞到哈希表里面。然后枚举第二个串的子串,去哈希表里面查即可。
一开始用的map,空间被卡常数了。
后来问了别人,发现set就能过,没必要用哈希表。
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
typedef unsigned int uin;
typedef unsigned long long ull;
const uin MOD1=2000000011;
const uin MOD2=1000000033;
const uin MOD=8002003;
const uin MODD=8004011;
struct HashTable
{
uin v[MOD];
int en,first[MOD],next[MOD],w[MOD];
HashTable(){en=0;memset(first,-1,sizeof(first));}
void insert(const uin &V,const int &W)
{
int U=(int)(V%MOD);
v[en]=V;
w[en]=W;
next[en]=first[U];
first[U]=en++;
}
int query(const uin &V)
{
int U=(int)(V%MOD),res=0;
for(int i=first[U];i!=-1;i=next[i])
if(v[i]==V){
return w[i];
}
return 0;
}
}T;
struct HashTable2
{
uin v[MODD];
int en,first[MODD],next[MODD],w[MODD];
HashTable2(){en=0;memset(first,-1,sizeof(first));}
void insert(const uin &V,const int &W)
{
int U=(int)(V%MODD);
v[en]=V;
w[en]=W;
next[en]=first[U];
first[U]=en++;
}
int query(const uin &V)
{
int U=(int)(V%MODD),res=0;
for(int i=first[U];i!=-1;i=next[i])
if(v[i]==V){
return w[i];
}
return 0;
}
}T2;
char a[4010],b[4010];
int n,m,ans;
uin pow1[4010],pow2[4010];
int main(){
pow1[0]=pow2[0]=1;
for(int i=1;i<=4000;++i){
pow1[i]=(uin)((ull)pow1[i-1]*(ull)10007%(ull)MOD1);
pow2[i]=(uin)((ull)pow2[i-1]*(ull)10009%(ull)MOD2);
}
scanf("%s%s",a+1,b+1);
n=strlen(a+1);
m=strlen(b+1);
for(int i=1;i<=n;++i){
uin hs1=0,hs2=0;
for(int j=i;j<=n;++j){
hs1=(uin)(((ull)hs1+(ull)pow1[a[j]-'a'])%(ull)MOD1);
hs2=(uin)(((ull)hs2+(ull)pow2[a[j]-'a'])%(ull)MOD2);
// ma[make_pair(hs1,hs2)]=j-i+1;
T.insert(hs1,j-i+1);
T2.insert(hs2,j-i+1);
}
}
for(int i=1;i<=m;++i){
uin hs1=0,hs2=0;
for(int j=i;j<=m;++j){
hs1=(uin)(((ull)hs1+(ull)pow1[b[j]-'a'])%(ull)MOD1);
hs2=(uin)(((ull)hs2+(ull)pow2[b[j]-'a'])%(ull)MOD2);
// ans=max(ans,ma[make_pair(hs1,hs2)]);
int tmp=T.query(hs1);
if(tmp==T2.query(hs2)){
ans=max(ans,tmp);
}
}
}
printf("%d\n",ans);
return 0;
}
【字符串哈希】【哈希表】Aizu - 1370 - Hidden Anagrams的更多相关文章
- Swift3.0语言教程获取字符串编码与哈希地址
Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取 ...
- redis哈希缓存数据表
redis哈希缓存数据表 REDIS HASH可以用来缓存数据表的数据,以后可以从REDIS内存数据库中读取数据. 从内存中取数,无疑是很快的. var FRedis: IRedisClient; F ...
- C# 将XML格式字符串,写入数据集的表中 XML解析
将XML格式字符串,写入数据集的表1中 命名空间:using System.Xml; string strRead;//strRead为以下xml值 ...
- Redis 命令,键(key),字符串(String),哈希(Hash),列表(List),集合(Set)(二)
Redis 命令 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. ...
- 《数据结构与算法分析:C语言描述》复习——第七章“哈希”——哈希表
2014.06.22 12:36 简介: 哈希是一种数学思想,将不定长数据通过函数转换为定长数据.不定长数据通常意味着碎片化,动态分配内存等等影响存储和性能的因素.当这个定长数据是一个无符号整数时,可 ...
- C# 计算字符串/文件的哈希值(MD5、SHA)
原文 C# 计算字符串的哈希值(MD5.SHA) 已做修改 一.关于本文 本文中是一个类库,包括下面几个函数: /// 1)计算32位MD5码(大小写):Hash_MD5_32 /// 2)计算16位 ...
- Bzoj4598: [Sdoi2016]模式字符串 点分治 哈希
国际惯例的题面:这种关于树上路径的题,我也没什么好办法,只好点分治.考虑当前分治重心为root,如何统计经过分治重心的路径的答案.我们令prf[i]表示某个点到root的路径(不含root)已经循环匹 ...
- poj1200 字符串hash 滚动哈希初探
假如要判断字符串A“AABA”是否是字符串B“AABAACAADAABAABA”的子串 最朴素的算法是枚举B的所有长度为4的子串,然后逐个与A进行对比,这样的时间复杂度是O(mn),m为A的长度,n为 ...
- sqlserver 字符串拼接及拆开联表查询的问题
一.sql根据一个以逗号隔开的人员guid类型的ID字符串查出其对应的姓名同样拼接成逗号隔开的字符串: 1.需求:管理员发送通知(通知分为普通通知,奖品订单,调查问卷三种类型)给用户,并且可以查看统计 ...
随机推荐
- 如何修改或美化linux终端
先丢一张效果图: 如何让您的 LD 的终端更具个性呢?首先,我们需要了解下面几点知识.A:配置文件 个人配置文件:~/.bashrc全局设定文件:/etc/bash.bashrc(修改需要管理员权限) ...
- 前端—css
css css概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一.css的四种引入方式: 1.行内式 ...
- C++学习之路(七):以const,enum,inline替换#define
这篇博文主要是编程中的一些问题和技巧.如题目所示,这些关键字的作用不再进行描述.直接描述功能和实例代码. 首先,在头文件中对类进行定义,是不会为类分配内存空间的,在这一点上类定义可以和普通变量类型的声 ...
- Linux 入门记录:十一、Linux 用户基础
一.用户.组 1. 用户 当我们使用 Linux 时,需要以一个用户的身份登录,一个进程也需要以一个用户的身份运行.用户限制使用者或进程可以使用或不可以使用哪些资源. 2. 组 组用来方便地管理用户. ...
- 解决TextView多行滑动与NestedScrollView等,滑动冲突,我的解决方案
1.首先要明白,什么时候回TextView处理滑动,什么时候不处理滑动 1.1往上滑动,到达文本底部就不要再处理了,如果往上滑动不在底部则继续TextView滑动 1.2往下滑动,到达文本顶部就不要再 ...
- 2015多校第6场 HDU 5360 Hiking 贪心,优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:给定n个人,现在要邀请这些人去远足,但每个人同意邀请的条件是当前已经同意去远足的人数c必须 ...
- 【VIPM技巧】多版本LabVIEW无法连接问题
前言 今天小编突然用到一个Toolkit,遂去VIPM上搜索,虽然可以找到但是无法连接成功LabVIEW,配置好一阵才解决.这里记录一下整个思路,供需要的人参考 问题记录 VIMP连接超时 问题解决 ...
- html添加新元素兼容和访问
<!DOCTYPE html> <html> <head> <title>Creating an HTML Element</title> ...
- Linux下几种并发服务器的实现模式
Linux下的几种并发服务器的设计模式 1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. ...
- ZOJ-3314
CAPTCHA Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %lld , %llu Java class ...