Codeforces 25E Test 【Hash】
Codeforces 25E Test
E. Test
Sometimes it is hard to prepare tests for programming problems. Now Bob is preparing tests to new problem about strings — input data to his problem is one string. Bob has 3 wrong solutions to this problem. The first gives the wrong answer if the input data contains the substring s1, the second enters an infinite loop if the input data contains the substring s2, and the third requires too much memory if the input data contains the substring s3. Bob wants these solutions to fail single test. What is the minimal length of test, which couldn’t be passed by all three Bob’s solutions?
Input
There are exactly 3 lines in the input data. The i-th line contains string si. All the strings are non-empty, consists of lowercase Latin letters, the length of each string doesn’t exceed 105.
Output
Output one number — what is minimal length of the string, containing s1, s2 and s3 as substrings.
Examples
input
ab
bc
cd
output
4
input
abacaba
abaaba
x
output
11
hash题,恶心了一个小时
我的奇葩思路:预处理a和b数组,分别是从前到后和从后往前的hash值前缀和
然后检查一下有没有包含关系
做完了细节比较多
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define LL long long
string s[3];
LL a[3][N],b[3][N],ans=0x3f3f3f3f;
LL base=131,Mod=100000007;
LL bas[N],vis[3]={0};
void solve(LL id){
LL len=s[id].size();
for(LL i=0;i<len;i++)a[id][i]=((i>0)*a[id][i-1]+s[id][i]*bas[i])%Mod;
for(LL i=len-1;i>=0;i--)b[id][i]=(b[id][i+1]+s[id][i]*bas[i])%Mod;
}
bool check_in(LL id1,LL id2){
LL len1=s[id1].size(),len2=s[id2].size();
LL h1=a[id1][len1-1],h2=a[id2][len1-1];
if(h1==h2)return 1;
for(LL i=len1;i<len2;i++){
h2=(a[id2][i]-a[id2][i-len1]+Mod)%Mod;
h1=h1*base%Mod;
if(h1==h2)return 1;
}
return 0;
}
LL getlen(LL id1,LL id2){
LL ans=0,len1=s[id1].size(),len2=s[id2].size();
for(LL i=1;i<min(len1,len2);i++)
if(b[id1][len1-i]==(a[id2][i-1]*bas[len1-i]%Mod))ans=max(ans,i);
return ans;
}
LL work(LL id1,LL id2,LL id3){
if(vis[id1]){
if(vis[id2])return s[id3].size();
if(vis[id3])return s[id2].size();
return s[id2].size()+s[id3].size()-getlen(id2,id3);
}
if(vis[id2]){
if(vis[id1])return s[id3].size();
if(vis[id3])return s[id1].size();
return s[id1].size()+s[id3].size()-getlen(id1,id3);
}
if(vis[id3]){
if(vis[id1])return s[id2].size();
if(vis[id2])return s[id1].size();
return s[id1].size()+s[id2].size()-getlen(id1,id2);
}
return s[id1].size()+s[id2].size()+s[id3].size()-getlen(id1,id2)-getlen(id2,id3);
}
int main(){
cin>>s[0]>>s[1]>>s[2];
if(s[1].size()<s[0].size())swap(s[0],s[1]);
if(s[2].size()<s[1].size())swap(s[1],s[2]);
if(s[1].size()<s[0].size())swap(s[0],s[1]);
LL maxlen=s[2].size();
bas[0]=1;
for(LL i=1;i<=maxlen;i++)bas[i]=(bas[i-1]*base)%Mod;
for(LL i=0;i<3;i++)solve(i);
if(check_in(0,1))vis[0]=1;
if(check_in(0,2))vis[0]=1;
if(check_in(1,2))vis[1]=1;
for(LL x=0;x<3;x++)
for(LL y=0;y<3;y++)
for(LL z=0;z<3;z++)
if(x!=y&&y!=z&&x!=z)
ans=min(ans,work(x,y,z));
cout<<ans;
return 0;
}
Codeforces 25E Test 【Hash】的更多相关文章
- [CodeForces - 1225C]p-binary 【数论】【二进制】
[CodeForces - 1225C]p-binary [数论][二进制] 标签: 题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory limit 5 ...
- 【hash】BZOJ3751-[NOIP2014]解方程
[题目大意] 已知多项式方程:a0+a1*x+a2*x^2+...+an*x^n=0.求这个方程在[1,m]内的整数解(n和m均为正整数). [思路] *当年考场上怒打300+行高精度,然而没骗到多少 ...
- 【hash】Power Strings
[题意]: 给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接.构成s串.如果有多个,请输出最多次数那个. 如:aaaa 可以用1个a,进行4次拼接 可以用2个a,进行2次拼接 可以用4个a,进行 ...
- 【hash】Similarity of Subtrees
图片来源: https://blog.csdn.net/dylan_frank/article/details/78177368 [题意]: 对于每一个节点来说有多少对相同的子树. [题解]: 利用层 ...
- 【hash】Seek the Name, Seek the Fame
[哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...
- 【hash】A Horrible Poem
[题目链接] # 10038. 「一本通 2.1 练习 4」A Horrible Poem [参考博客] A Horrible Poem (字符串hash+数论) [题目描述] 给出一个由小写英文字母 ...
- 【hash】Three friends
[来源]:bzoj3916 [参考博客] BZOJ3916: [Baltic2014]friends [ 哈希和哈希表]Three Friends [Baltic2014][BZOJ3916]frie ...
- 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】
[链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...
- 【hash】珍珠
[来源] https://loj.ac/problem/2427 [参考博客] LOJ#2427. 「POI2010」珍珠项链 Beads [题解]: 复杂度计算: 暴力枚举k每次计算是n/2+n/3 ...
随机推荐
- kubernetes dashboard 二次开发
Kubernetes Dashboard 二次开发 官方源码:https://github.com/kubernetes/dashboard 开发文档:https://github.com/kuber ...
- Vue——解决[Vue warn]: Invalid prop: custom validator check failed for prop "index". found in错误
Invalid prop: custom validator check failed for prop "index". 错误重现: 使用element-ui的菜单,在SubMe ...
- wampserver安装及安装中可能遇到的问题
首先wampserver是windows apache Mysql PHP 集成开发环境,即在windows下的apache.php和mysql的服务器.因此wampserver是一个服务器端应用程序 ...
- RabbitMQ :常用命令与图形管理及用户权限
RabbitMQ 安装 安装 RabbitMQ 前要先安装 Erlang,可以去 Erlang 官网下载,接着去 RabbitMQ 官网下载安装包,解压缩即可 Mac 用户可以通过 HomeBrew ...
- PHP数组合并:[“+”运算符]、[array_merge]、[array_merge_recursive]区别
1.“+”运算符规则: 当两个数组的键名是数字键名或者字符串键名 $c = $a + $b 在$a后追加($b在$a中不存在的键名)键名和值注意: 1.不覆盖,只是追加不存在的键名和对应的值 2.键名 ...
- C++实现矩阵压缩
C++实现矩阵压缩 转置运算时一种最简单的矩阵运算.对于一个m*n的矩阵M,他的转置矩阵T是一个n*m的矩阵,且T(i,j) = M(j,i). 一个稀疏矩阵的转置矩阵仍然是稀疏矩阵. 矩阵转置 方案 ...
- hdu4347The Closest M Points kdtree
kdtree讲解: https://blog.csdn.net/qing101hua/article/details/53228668 https://blog.csdn.net/acdreamers ...
- ContOS网络连接及简单的ssh Xshell连接!
这边简单的记录一下下ContOS网络连接及简单的ssh Xshell连接! 首先你得安装一个Contos Linux系统对吧! 1.找到设置--->网络-->有线连接-->IPv4 ...
- 二十二 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别
第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://github.com/muchrooms/zheye 注意:此程序依赖以下模块包 Keras==2.0.1 Pillow= ...
- windows配置redis(转)
此文章全部是转的,我之前是woidows启动redis无法加载配置找到的:原文链接:http://www.cnblogs.com/smileyearn/articles/4749746.html 在w ...