Clairewd's message /// 字符串hash
题目大意:
给定字符串s 是26个字母对应的密文字母
给定字符串c1 是 密文+部分原文
原文可能缺损 要求将原文补全输出
利用s得到密文字母对应的原字母rs
利用rs翻译c1得到 原文+部分密文c2
由于密文肯定是完整的 此时
c1 完整密文+部分原文
c2 完整原文+部分密文
将两个字符串hash 若一段字符相等则对应段的hash值也相等
枚举原文的长度 就可以得到在c1中原文的开始位置len
则此时假设 c1中 n-len+1~n 为原文 则c2中1~len为原文
若此时这两段字符的hash值相等 则假设成立
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
#define gcd(i,j) __gcd(i,j);
const int maxn=1e5+;
const int mod=1e9+;
const double eps=1e-; typedef unsigned long long ull;
struct hash_table{
ull seed=;
ull Hash[maxn],temp[maxn];
void work(char *s,int n){
temp[]=; Hash[]=;
for(int i=;i<=n;i++)temp[i]=temp[i-]*seed;
for(int i=;i<=n;i++)Hash[i]=(Hash[i-]*seed+(s[i]-'a'));
}
ull get(int l,int r){
return Hash[r]-Hash[l-]*temp[r-l+];
}
}h1, h2; char c1[maxn],c2[maxn];
char s[],rs[]; int main()
{
int _; scanf("%d",&_);
while(_--) {
scanf("%s%s",s,c1+);
inc(i,,-) rs[s[i]-'a']=i+'a';
int n=strlen(c1+);
inc(i,,n) c2[i]=rs[c1[i]-'a'];
h1.work(c1,n); h2.work(c2,n);
// h1对应的 c1是完整密文+部分原文
// h2对应的 c2是完整原文+部分密文
int ans=n;
inc(i,n,n*-) { // 枚举整串的长度
if(i&) continue; // 奇数长度跳过
int mid=i/; // 得到此时密文的长度
int len=n-mid; // 再得到部分原文的长度
ULL s1=h1.get(n-len+,n); // 部分原文的密文
ULL s2=h2.get(,len); // 部分原文
if(s1==s2) { ans=mid; break; }
// 若两个区间hash值相同 说明两段字符相同
}
inc(i,,ans) printf("%c",c1[i]);
inc(i,,ans) printf("%c",c2[i]);
printf("\n");
} return ;
}
Clairewd's message /// 字符串hash的更多相关文章
- hdu 4300 Clairewd’s message 字符串哈希
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- hdu------(4300)Clairewd’s message(kmp)
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 4300 Clairewd’s message KMP应用
Clairewd’s message 题意:先一个转换表S,表示第i个拉丁字母转换为s[i],即a -> s[1];(a为明文,s[i]为密文).之后给你一串长度为n<= 100000的前 ...
- hdu4300 Clairewd’s message【next数组应用】
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- [知识点]字符串Hash
1.前言 字符串的几大主要算法都多少提及过,现在来讲讲一个称不上什么算法, 但是非常常用的东西——字符串Hash. 2.Hash的概念 Hash更详细的概念不多说了,它的作用在于能够对复杂的状态进行简 ...
- 【BZOJ-3555】企鹅QQ 字符串Hash
3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1545 Solved: 593[Submit][Statu ...
- POJ 1200 字符串HASH
题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...
- LA4671 K-neighbor substrings(FFT + 字符串Hash)
题目 Source http://acm.hust.edu.cn/vjudge/problem/19225 Description The Hamming distance between two s ...
随机推荐
- .net core 部署到IIS 以及上 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure
安装AspNetCoreModule托管模块后执行 1.net stop was /y 2.net start w3svc 测试可以,但是需要装对应的托管模块的版本. 1. .NET Core与Win ...
- 从FreeBSD里面看到的网络协议列表,感觉可以保存一下
# # Internet protocols # # $FreeBSD$ # from: @(#)protocols 5.1 (Berkeley) 4/17/89 # # See also http: ...
- 想实现网页滚动一定距离底部弹出div
<script type="text/javascript"> $(window).scroll(function () { if ($(this).scrollTop ...
- python使用logging模块实现日志写入
python实现的logging写入日志的功能.logging模块还是挺好用的 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018 ...
- (原)centos 防火墙开放端口命令
centos 防火墙默认是关闭非系统端口的,所以用到非系统端口首先开放,命令如下 firewall-cmd --zone=public --add-port=1935/tcp --permanent ...
- Bootstrap 网页1
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 割边的tarjan算法
与割点唯一一点不同是low[v]>=dfn[u]变为low[v]>dfn[u] 代码如下: bool vis[maxn]; int dfn[maxn],low[maxn]; int cnt ...
- Java实现按汉语拼音的排序
public class sortByPinyin { public static void main(String[] args) { String[] arr = { "刘刘" ...
- vs code常用插件(python)
1.chinese 作用:vscode设置为中文. 使用方法:Ctrl+Shift+P:输入 "config":选择zh 2.python 作用:调试 3.autoDocstrin ...
- 饿了么监控系统 EMonitor 与美团点评 CAT 的对比
背景介绍 饿了么监控系统EMonitor:是一款服务于饿了么所有技术部门的一站式监控系统,覆盖了系统监控.容器监控.网络监控.中间件监控.业务监控.接入层监控以及前端监控的数据存储与查询.每日处理总数 ...