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】的更多相关文章

  1. [CodeForces - 1225C]p-binary 【数论】【二进制】

    [CodeForces - 1225C]p-binary [数论][二进制] 标签: 题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory limit 5 ...

  2. 【hash】BZOJ3751-[NOIP2014]解方程

    [题目大意] 已知多项式方程:a0+a1*x+a2*x^2+...+an*x^n=0.求这个方程在[1,m]内的整数解(n和m均为正整数). [思路] *当年考场上怒打300+行高精度,然而没骗到多少 ...

  3. 【hash】Power Strings

    [题意]: 给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接.构成s串.如果有多个,请输出最多次数那个. 如:aaaa 可以用1个a,进行4次拼接 可以用2个a,进行2次拼接 可以用4个a,进行 ...

  4. 【hash】Similarity of Subtrees

    图片来源: https://blog.csdn.net/dylan_frank/article/details/78177368 [题意]: 对于每一个节点来说有多少对相同的子树. [题解]: 利用层 ...

  5. 【hash】Seek the Name, Seek the Fame

    [哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...

  6. 【hash】A Horrible Poem

    [题目链接] # 10038. 「一本通 2.1 练习 4」A Horrible Poem [参考博客] A Horrible Poem (字符串hash+数论) [题目描述] 给出一个由小写英文字母 ...

  7. 【hash】Three friends

    [来源]:bzoj3916 [参考博客] BZOJ3916: [Baltic2014]friends [ 哈希和哈希表]Three Friends [Baltic2014][BZOJ3916]frie ...

  8. 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】

    [链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...

  9. 【hash】珍珠

    [来源] https://loj.ac/problem/2427 [参考博客] LOJ#2427. 「POI2010」珍珠项链 Beads [题解]: 复杂度计算: 暴力枚举k每次计算是n/2+n/3 ...

随机推荐

  1. 分页式存储管理方式AND请求分页式存储管理

    先说下什么是页(页面):就是将用户的程序的的地址空间分成固定大小的区域,称为”页“,或者”页面“ 之后将这些页离散的放进内存中,这样解决了内存的碎片问题 记得老师上课说了下这两个概念不能混,现在区分下 ...

  2. ECMAScript 5中对Array中新增了9个方法

    ECMAScript 5中对Array中新增了9个方法: 5个迭代方法(循环操作数组中的各个项):forEach(),map(),filter(),every()和some() 2个归并方法(迭代数组 ...

  3. 初识HTML和CSS

    HTML 1.一套规则,浏览器认识的规则. 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ****** - 数据库获取数据,然后替换到html文件的指定位置(W ...

  4. kibana 安装

    一 介绍 kibana 主要实现对日志的可视化显示. 二 安装 下载安装包: wget https://download.elastic.co/kibana/kibana/kibana-4.1.2-l ...

  5. Shell date 命令详解

    格式: date [选项] ... [+格式] 选项说明: -d ,--date=字符串 显示指定字符串所描述的时间 格式说明: 例子1: #!/bin/bash ##. 获取当前系统时间 YYYY- ...

  6. spring mvc: 资源绑定视图解析器(不推荐)

    spring mvc: 资源绑定视图解析器(不推荐) 不适合单控制器多方法访问,有知道的兄弟能否告知. 访问地址: http://localhost:8080/guga2/hello/index 项目 ...

  7. Java Object类的方法

    1. Java中所有的类都直接或者间接地继承自Object类.当没有显式地声名一个类的父类时,它会隐式地继承Object类. 2. Object类中定义了适合于任何Java对象的方法. String ...

  8. 三十 Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中

    1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号,signals.spider_closed是爬虫结束信号 # -*- coding: u ...

  9. Java读写文化总结

    Java读文件 package 天才白痴梦; import java.io.BufferedReader; import java.io.File; import java.io.FileInputS ...

  10. 解决spring boot在RabbitMQ堆积消息情况下无法启动问题

    最近遇到一个问题,服务站点上线之前,先去新建需要的rabbitmq并绑定关系,此时 如果发送消息方运行, 那边会造成新建的q消息部分堆积得不到及时消费 那么问题来了? 在消息堆积情况下,服务站点无法启 ...