题目大意:

给定字符串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的更多相关文章

  1. hdu 4300 Clairewd’s message 字符串哈希

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774

    Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...

  3. hdu------(4300)Clairewd’s message(kmp)

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. hdu 4300 Clairewd’s message KMP应用

    Clairewd’s message 题意:先一个转换表S,表示第i个拉丁字母转换为s[i],即a -> s[1];(a为明文,s[i]为密文).之后给你一串长度为n<= 100000的前 ...

  5. hdu4300 Clairewd’s message【next数组应用】

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. [知识点]字符串Hash

    1.前言 字符串的几大主要算法都多少提及过,现在来讲讲一个称不上什么算法, 但是非常常用的东西——字符串Hash. 2.Hash的概念 Hash更详细的概念不多说了,它的作用在于能够对复杂的状态进行简 ...

  7. 【BZOJ-3555】企鹅QQ 字符串Hash

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1545  Solved: 593[Submit][Statu ...

  8. POJ 1200 字符串HASH

    题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...

  9. LA4671 K-neighbor substrings(FFT + 字符串Hash)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/19225 Description The Hamming distance between two s ...

随机推荐

  1. [fw]IDT表的初始化

    IDT表的初始化  linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为: struct desc_struct idt_table[256] __attribute__((_ ...

  2. [Java 教程 00] 计算机基础

    前言 我想,来到这的朋友肯定是想学习JAVA或者想要进入IT这个行业的.考虑到大家的基础可能不一样,有些人可能还是用着新买的电脑,为了让大家在后续的学习中更加顺畅.在学习一门全新的计算机语言之前,我需 ...

  3. elasticsearch Java High Level REST 相关操作封装

    pox.xml文件添加以下内容 <dependency> <groupId>org.elasticsearch.client</groupId> <artif ...

  4. shell整数测试

  5. 三、Json方式函数

    一.Json方式函数 // 4. 查看对象信息 console.dir(obj) =>可以显示一个对象所有的属性和方法. var info = { blog: "http://cllg ...

  6. 在脚本中使用set命令调试脚本

    当脚本文件较长时,可以使用set命令指定调试一段脚本.在脚本中使用set -x命令开启调式模式:使用set +x命令关闭调式模式. 例如: #!/bin/bash #Scriptname: greet ...

  7. 说一说Vuex有哪几种状态和属性

    vuex的流程 页面通过mapAction异步提交事件到action.action通过commit把对应参数同步提交到mutation mutation会修改state中对应的值.最后通过getter ...

  8. ivew 修改排序号的逻辑

    排序号修改的逻辑 1.构建修改排序号传递的参数 formInline2:{ recommendType:4, //产品类型 merchantCodes:[], //产品code discountRec ...

  9. 查看tomcat的版本号

    本经验主要介绍在windows下,如何查看tomcat的版本号. 工具/原料 安装了tomcat server的操作系统. 一.绿色版tomcat版本查看--命令catalina version 或者 ...

  10. 【leetcode】1006. Clumsy Factorial

    题目如下: Normally, the factorial of a positive integer n is the product of all positive integers less t ...