Birthday Cake

思路:找到每个串的公共前后缀,统计公共前后缀之间的字符串的hash值,并判断所给n个串中是否存在符合条件的串
eg:abbddab
对于该串,我们不难发现,公共前后缀是ab,公共前后缀之间的串是bdd,我们需要统计所有串中bdd出现的次数
注意,求得不是最长公共前后缀,而是所有的公共前后缀
细节问题:1、取模
2、RE可能是因为tmp定义为string,每次对tmp赋值的时候,tmp串会进行依次刷新,会造成堆栈溢出
#include<bits/stdc++.h>
#define ll long long
#define mp make_pair
using namespace std; const int N = 4e5 + 10;
const ll m1 = 1e9 + 7;
const ll m2 = 1e9 + 9;
const int mod1 = 233;
const int mod2 = 19;
string st[N];
char tmp[N];
ll n, ans;
ll num1[N], num2[N], hash1[N], hash2[N];
map<pair<ll,ll>, int> cnt; //每个串,只需要考虑长度小于等于该串的长度的串
bool cmp(string st1, string st2){
if(st1.size() < st2.size()) return true;
return false;
} void init(){
num1[0] = num2[0] = 1;
for(int i = 1; i < N - 1; i++){
num1[i] = num1[i - 1] * mod1 % m1;
num2[i] = num2[i - 1] * mod2 % m2;
}
} ll gethash1(int l, int r){
if(l > r) return 0;
return (hash1[r] - (hash1[l - 1] * num1[r - l + 1]) % m1 + m1)%m1;
} ll gethash2(int l, int r){
if(l > r) return 0;
return (hash2[r] - (hash2[l - 1] * num2[r - l + 1]) % m2 + m2) % m2;
} signed main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> st[i];
}
init();
sort(st + 1, st + 1 + n, cmp);
for(int i = 1; i <= n; i++){
int len = st[i].size();
for(int j = 0; j < len; j++){
tmp[j + 1] = st[i][j];
}
for(int j = 1; j <= len; j++){
hash1[j] = (hash1[j - 1] * mod1 % m1 + (tmp[j] - 'a') + 122)%m1;
hash2[j] = (hash2[j - 1] * mod2 % m2 + (tmp[j] - 'a') + 122) % m2;
}
for(int j = 1; j <= len - j + 1; j++){
int t = len - j + 1;
if(gethash1(1,j) == gethash1(t,len) && gethash2(1,j) == gethash2(t, len)){
ans += cnt[mp(gethash1(j + 1, t - 1), gethash2(j + 1, t - 1))];
}
}
ans += cnt[mp(gethash1(1, len), gethash2(1, len))];
cnt[mp(gethash1(1, len), gethash2(1, len))]++;
}
cout << ans;
return 0;
}

双哈希_Birthday_Cake的更多相关文章

  1. Codeforces Round #578 (Div. 2) E. Compress Words (双哈希)

    题目:https://codeforc.es/contest/1200/problem/E 题意:给你n个单词,你需要把他合成成一个句子,相邻的两个单词,相邻部分相同的话可以把其中一个的删掉 思路:因 ...

  2. Cuckoo for Hashing_双哈希表

    问题 B: Cuckoo for Hashing 时间限制: 1 Sec  内存限制: 64 MB提交: 24  解决: 12[提交][状态][讨论版] 题目描述 An integer hash ta ...

  3. poj1200Crazy Search (哈希)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Crazy Search Time Limit: 1000MS   Memory ...

  4. 洛谷 P3370 【模板】字符串哈希

    洛谷 P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的 ...

  5. HASH 字符串哈希 映射转化

    哈希HASH的本质思想类似于映射.离散化. 哈希,通过给不同字符赋不同的值.并且钦定一个进制K和模数,从而实现一个字符串到一个模意义下的K进制数上. 它的主要目的是判重,用于$DFS$.$BFS$判重 ...

  6. 【CodeForces】961 F. k-substrings 字符串哈希+二分

    [题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...

  7. 【Python算法】哈希存储、哈希表、散列表原理

    哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中 ...

  8. Redis源码研究:哈希表 - 蕫的博客

    [http://dongxicheng.org/nosql/redis-code-hashtable/] 1. Redis中的哈希表 前面提到Redis是个key/value存储系统,学过数据结构的人 ...

  9. codevs2147数星星(哈希)

    2147 数星星  时间限制: 3 s  空间限制: 64000 KB  题目等级 : 钻石 Diamond   题目描述 Description 小明是一名天文爱好者,他喜欢晚上看星星.这天,他从淘 ...

  10. 【CodeForces727E/CF727E】Games on a CD (字符串哈希)

    题目: CodeForces727E 分析: 看到字符串比较,肯定想到哈希啊--现学的哈希,先丢两个重要的公式 (\(seed\)是大于字符集大小的质数,\(p\)是大质数) \[hash[i]=(h ...

随机推荐

  1. [转帖]tidb集群部署

    http://blog.itpub.net/29785807/viewspace-2789852/ 一.安装规划 1 2 3 4 5 6 使用15台服务器 5台tidb服务器:每台3个tidb实例+1 ...

  2. [转帖]jcmd命令详解

    1 基本知识 jcmd 是在 JDK1.7 以后,新增了一个命令行工具. jcmd 是一个多功能的工具,相比 jstat 功能更为全面的工具,可用于获取目标 Java 进程的性能统计.JFR.内存使用 ...

  3. [转帖]ls命令

    ls(list) 命令可以说是Linux下最常用的命令之一 #ls -l;列出文件的详细信息 #ll 以上两个命令一样,ll是ls -l的简写 #ls -al;列出目录下的所有文件,包括以 . 开头的 ...

  4. [专题]中立遭质疑,提价遭反对,ARM的生存难题怎么破?

    中立遭质疑,提价遭反对,ARM的生存难题怎么破? https://news.cnblogs.com/n/669715/ ARM税要提高.. RISC-V的机会? 文/黎文婕 来源:锌刻度(ID:znk ...

  5. PG数据库恢复简单记录

    公司同事给了一个很小的数据 我这边进行备份和恢复操作 第一步 创建数据库 su - postgres #进入pg数据库的用户 psql #输入密码 登录 create user demo with p ...

  6. vue/cli的配置详解

    查看vue/cli的配置 vue的脚手架隐藏了所有的webpack相关的配置,若是想要查看webpack的配置 你可以去执行 vue inspect > output.js 这样就可以查看它的配 ...

  7. js正则手机号 验证

    注意一下 现在手机号第二位是不是 只有3 4 5 7 8这几个数, 如果还有请告诉我,否则这个正则表达式式错误的. <div id="app"> <el-inpu ...

  8. js分钟转化为小时并且以某个数字进行递增

    有些时候,我们需要将分钟转为小时: 并且还有以一个数字进行递增: 呈现出[3,6,9,12,15,18]这样的递增形式 // 因为是递增,所以是相加: // 在使用+号的时候: // 注意两边都是数字 ...

  9. FM的一种简易解调方式

    理论来源 <高低频电路设计与制作> 铃木雅臣 著.这位作者的书写的都不错 电路图 模拟思路 设输入信号为 \[s(t) = \sin(w_0 t + \Delta w\int_{- \in ...

  10. Fabric配置块结构解析

    本文是区块链浏览器系列的第二篇. 上一篇介绍了交易块中的数据结构,这一篇介绍区块链网络中的配置块数据结构. 这两种区块中数据结构内容的区别主要Payload结构体中的Data域中的内容,接下来将以类图 ...