概念

查询字串的hash值

我们所说的哈希通常都是进制哈希,因为它具有一些很方便的性质,例如,具有和前缀和类似的性质。

假设一个字符串的前缀哈希值记为 $h[i]$,进制为 $base$,那么显然 $h[i] = h[i-1] \times base + s[i]$.

记 $p[i]$ 为 $base$ 的 $i$ 次方,那么我们可以 $O(1)$ 得到一个字串的哈希值。

typedef unsigned long long ull;
ull get_hash(int l, int r) {
return h[r] - h[l - ] * p[r - l + ];
}

其中,乘以 $p[r-l+1]$ 相当于左移了 $r-l+1$ 位。

同样,我们可以 $O(1)$ 得到字串中删除一个字符后的hash值。

ull get_s(int l, int r, int x) {
return get_hash(l, x - ) * p[r - x] + get_hash(x + , r);
}

例题

题意:给定一个字符串 $S$,先将字符串 $S$ 复制一次,得到字符串 $T$,然后在 $T$ 中插入一个字符,得到字符串 $U$。现给出字符串 $U$,要求重新构造出 $S$。

分析:

枚举每一个位置,剩下的应是两个相同的字符串,根据hash值判断一下。

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
typedef unsigned long long ull;
const ull base = ;
const int maxn = +;
ull h[maxn], p[maxn];
char s[maxn];
int len; void init()
{
ll ans = ;
for(int i=;i<len;i++)
{
ans = (ans*base) + (ull)s[i];
h[i] = ans;
}
p[] = ;
for(int i=;i<=len;i++)
{
p[i] = p[i-]*base;
}
} inline ll gethash(int l,int r)
{
return h[r] - h[l-]*p[r-l+];
} inline ll del(int l,int r,int x)
{
if(x<l||x>r)
return gethash(l,r);
return gethash(l,x-)*p[r-x]+gethash(x+,r);
} inline int check(int x) //检查去掉第x位时是否合法
{
if(x<=len/&&del(,len-,x)==del(,len>>,x)*p[len>>]+del(,len>>,x))
return ;
else if(x>len/&&del(,len-,x)==del(,(len>>)-,x)*p[len>>]+del(,(len>>)-,x))
return ;
else
return ;
} int main()
{
scanf("%d",&len);
scanf("%s",s);
init();
int cnt = ;
int ii = -;
ll num;
for(int i=;i<len;i++)
{
if(check(i))
{
cnt++;
if(ii==-)
{
ii=i;
num = del(,len-,i);
}
else
{
if(del(,len-,ii)==del(,len-,i)) //可能是相同的串
cnt--;
}
}
if(cnt==)
{
printf("NOT UNIQUE\n");
return ;
}
}
if(cnt==)
{
int m = ;
for(int j=;j<len;j++) //输出结果
{
if(j==ii)
continue;
printf("%c",s[j]);
m++;
if(m==(len-)/)
break;
}
printf("\n");
}
if(cnt==)
{
printf("NOT POSSIBLE\n");
}
return ;
}

参考链接:https://loj.ac/submission/576434

LOJ2823 三个朋友 ——查询字串的哈希值的更多相关文章

  1. 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换

    ###题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换 ...

  2. HDU4641 || 6194多校 (后缀自动机-最少出现K次的字串个数 || 恰好出现K次字符串的个数)

    http://acm.hdu.edu.cn/showproblem.php?pid=4641 http://acm.hdu.edu.cn/showproblem.php?pid=6194 题意: 开始 ...

  3. 2019年华南理工大学程序设计竞赛(春季赛) K Parco_Love_String(后缀自动机)找两个串的相同字串有多少

    https://ac.nowcoder.com/acm/contest/625/K 题意: 给出Q 个询问 i , 求 s[0..i-1] 与 s[i...len-1] 有多少相同的字串 分析: 给出 ...

  4. java之字符串中查找字串的常见方法

    1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引.      int indexOf(String str, int startIndex):从指定 ...

  5. 【字符串】BZOJ上面几个AC自动机求最为字串出现次数的题目

    (一下只供自己复习用,目的是对比这几个题,所以写得不详细.需要细节的可以参考其他博主) [BZOJ3172:单词] 题目: 某人读论文,一篇论文是由许多(N)单词组成.但他发现一个单词会在论文中出现很 ...

  6. 最大公共字串LCS问题(阿里巴巴)

    给定两个串,均由最小字母组成.求这两个串的最大公共字串LCS(Longest Common Substring). 使用动态规划解决. #include <iostream> #inclu ...

  7. 编程:使用递归方式判断某个字串是否回文(Palindrome)

    Answer: import java.util.Scanner; public class Palindrome { private static int len;//全局变量整型数据 privat ...

  8. NOIP2002字串变换[BFS]

    题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...

  9. 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。

    split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...

随机推荐

  1. 030 Android 第三方开源下拉框:NiceSpinner的使用+自定义Button样式+shape绘制控件背景图+图片选择器(selector)

    1.NiceSpinner下拉框控件介绍 Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框 ...

  2. js多种去重的方法总结

    第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中 Array.pro ...

  3. python离线安装外部库(第三方库)

    在官网下好外部库,解压后,点击解压后的文件夹,按住shift 右击在命令行中执行 输入 python setup.py install

  4. Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

    在 Docker 容器里面使用 docker run/docker build? Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择.而在 DevOps 中,我们需要将各种后端/前端 ...

  5. 在微服务架构中service mesh是什么?

    在微服务架构中service mesh是什么 什么是 service mesh ? 微服务架构将软件功能隔离为多个独立的服务,这些服务可独立部署,高度可维护和可测试,并围绕特定业务功能进行组织. 这些 ...

  6. 如何录屏做GIF图

    网上找了一下,ScreenToGif 这个神器 https://github.com/NickeManarin/ScreenToGif https://github.com/NickeManarin/ ...

  7. ExcelReport.cs Excel操作类、实例源码下载

    标题一.告别ASP.NET操作EXCEL的烦恼标题二.ASP.NET操作EXCEL 合并单元格 大全... cnblogs/hanzhaoxin/韩兆新的博客园ExcelReport第一篇:使用Exc ...

  8. Bigdecimal除法异常

    1.异常信息摘要(详细请见文末): java.lang.ArithmeticException: Non-terminating decimal expansion; no exact represe ...

  9. 简单web性能测试工具——ab命令(ApacheBench)

    ab命令(ApacheBench) ----------转载内容 ApacheBench(即ab)通常用来做网站性能压力测试,是性能调优过程中必不可少的一环,ab命令会创建很多的并发访问线程,模拟多个 ...

  10. springcloud源码解析(目录)

    springcloud是一个基于springboot的一站式企业级分布式应用开发框架.springboot为其提供了创建单一项目的便利性,springcloud组合了现有的.常用的分布式项目的解决方案 ...