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 ...
随机推荐
- location的部分属性
http://www.w3school.com.cn/jsref/dom_obj_location.asp location.host 可以设置或返回主机名和当前url的端口 www.w3sch ...
- JavaScript高级程序设计-读书笔记(1)
第1章 JavaScript简介 JavaScript是一种专为与网页交互而设计的脚本语言,由下列三个不同的部分组成: l ECMAScript:提供核心语言功能: l 文 ...
- MySQL行锁、间隙锁、Next-Key锁
InnoDB是一个支持行锁的存储引擎,它有三种行锁的算法: Record Lock:行锁,单个行记录上的锁. Gap Lock:间隙锁,锁定一个范围,但不包括记录本身.GAP锁的目的,是为了防止幻读. ...
- js中的内部属性与delete操作符
本文正式地址:http://www.xiabingbao.com/javascript/2015/08/03/javascript-delete-configurable 在讲解Configurabl ...
- mysql数据库优化课程---15、mysql优化步骤
mysql数据库优化课程---15.mysql优化步骤 一.总结 一句话总结:索引优化最立竿见影 1.mysql中最常用最立竿见影的优化是什么? 索引优化 索引优化,不然有多少行要扫描多少次,1亿行大 ...
- spring mvc:练习:javaConfig配置和注解
Spring4 MVC HelloWorld 注释/JavaConfig为示例,一步一步以简单的方式学习Spring4 MVC 的注解,项目设置,代码,部署和运行. 我们已经使用XML配置开发了一个H ...
- SEA 教程
Sina App Engine(SAE)教程(11)- Yaf使用 Sina App Engine(SAE)入门教程(10)- Cron(定时任务)使用 Sina App Engine(SAE)入门教 ...
- table 转实体
public class Table2Entity<T> where T : class,new() { public static List<T> GetEntitys(Da ...
- IOS-H5容器的一些探究:UIWebView和WKWebView的比较和选择
一.Native开发中为什么需要H5容器 Native开发原生应用是手机操作系统厂商(目前主要是苹果的iOS和google的Android)对外界提供的标准化的开发模式,他们对于native开发提供了 ...
- Quartz教程:快速入门
原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...