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. 一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断?

    我们有2台内部http服务(nginx): 201:这台服务器部署的服务是account.api.91160.com,这个服务是供前端页面调用: 202:这台服务器部署的服务是hdbs.api.911 ...

  2. C#之多线程

    多线程在C#中使用得非常频繁,线程之间的充分利用显得尤为重要,一般的写法都是得不到充分利用资源,本人针对多线程写了一种方法,可以充分利用资源,保证每次同时启动10条线程,现在执行完马上再启动一条,总之 ...

  3. C# 同步调用、异步调用、异步回调

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: public dele ...

  4. Android -- 提交数据到服务器,Get Post方式, 异步Http框架提交

    1. 发送请求到服务器有几种方式 (1)HttpURLConnection (2)Httpclient 同步框架 (3)AsyncHttpClient 异步框架 (https://github.com ...

  5. 关于MAC升级后,vim更新插件报错

    找不到路径: 直接在终端 terminal 输入: xcode-select --install

  6. C#显示接口实现和隐式接口实现

    在项目中可能会遇到显示接口实现和隐式接口实现.什么意思呢?简单来说使用接口名作为方法名的前缀,这称为“显式接口实现”:传统的实现方式,称为“隐式接口实现”.隐式接口实现如下: interface IS ...

  7. PHP会话控制之如何正确设置session_name

    定义: string session_name([string $name]) 说明: 在php.ini中配置为:session.name = PHPSESSID 在请求开始的时候,会话名称会被重置并 ...

  8. 最简js深浅拷贝说明

    1.浅拷贝 浅拷贝是拷贝引用,拷贝后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响.  浅拷贝分两种情况: 1.直接拷贝源对象的引用 2. 源对象拷贝实例,但其属性对象(类型为Object, ...

  9. Qt5全局热键-QxtGlobalShortcut

    最近做一个项目需要注册全局热键,在网上搜索发现有个第三方库 libqxt 中给出一个比较好的跨平台的解决方案,就是 QxtGlobalShortcut. 但是编译过程中发现这个库用到的QAbstrac ...

  10. HighCharts 特性;Highcharts 环境配置

    Highcharts Highcharts 是一个用纯JavaScript编写的一个图表库. Highcharts 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表 Highchart ...