当前位置: 首页 > news >正文

[codeforces] 25E Test || hash

原题

给你三个字符串,找一个字符串(它的子串含有以上三个字符串),输出此字符串的长度。


先暴力判断是否有包含,消减需要匹配的串的数量。因为只有三个字符串,所以暴力枚举三个串的位置关系,对三个串跑好哈希,然后判断后缀与前缀重合长度即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define mo 99994711
typedef long long ll;
using namespace std;
int is1=1,is2=1,all=3,base=1314,ord[4],ans,l[4];
long long num[4][100010],bs[100010];
bool vis[4];
char s[4][100010];

ll gethash(int x,int st,int l)
{
    ll ans=0;
    ans=bs[100005-st]*(num[x][st+l-1]-(st==0? 0 : num[x][st-1]))%mo;
    return (ans%mo+mo)%mo;
}

bool in(int x,int y)
{
    ll u,v;
    for (int i=0;i<l[y]-l[x];i++)
    {
    u=gethash(y,i,l[x]);
    v=num[x][l[x]-1]*bs[100005]%mo;
    if (u==v) return 1;
    }
    return 0;
}

int mini(int x,int y)
{
    ll u,v;
    int ans=0;
    for (int i=1;i<=min(l[x],l[y]);i++)
    {
    u=gethash(x,l[x]-i,i);
    v=gethash(y,0,i);
    if (u==v) ans=i; 
    }
    return ans;
}

void hsh(int x)
{
    for (int i=0;i<l[x];i++)
    if (i) num[x][i]=(num[x][i-1]+(ll)(s[x][i]-'a'+1)*bs[i])%mo;
    else num[x][i]=s[x][i]-'a'+1;
}

void dfs(int x)
{
    if (x>3)
    {
    ans=min(ans,l[1]+l[2]+l[3]-mini(ord[1],ord[2])-mini(ord[2],ord[3]));
    return ;
    }
    for (int i=1;i<=3;i++)
    if (!vis[i])
    {
        vis[i]=1;
        ord[x]=i;
        dfs(x+1);
        vis[i]=0;
    }
}

void st()
{
    if (l[1]>l[2]) swap(l[1],l[2]),swap(s[1],s[2]);
    if (l[2]>l[3]) swap(l[2],l[3]),swap(s[2],s[3]);
    if (l[1]>l[2]) swap(l[1],l[2]),swap(s[1],s[2]);
}

int main()
{
    ans=0x7fffffff;
    bs[0]=1;
    for (int i=1;i<=100005;i++) bs[i]=bs[i-1]*base%mo;
    scanf("%s%s%s",s[1],s[2],s[3]);
    l[1]=strlen(s[1]);
    l[2]=strlen(s[2]);
    l[3]=strlen(s[3]);
    st();
    hsh(1);
    hsh(2);
    hsh(3);
    if (in(1,2)) is1=0,all--;
    if (in(2,3)) is2=0,all--;
    if (is1 && in(1,3)) is1=0,all--;
    if (all==1)
    {
    printf("%d\n",l[3]);
    return 0;
    }
    if (all==2)
    {
    if (!is2 && is1) swap(s[1],s[2]),swap(l[1],l[2]);
    hsh(2);
    hsh(3);
    printf("%d\n",l[2]+l[3]-max(mini(2,3),mini(3,2)));
    }
    else
    {
    dfs(1);
    printf("%d\n",ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/mrha/p/8024224.html

相关文章:

  • python入门----hello world
  • HDU2019数列有序!
  • Kafka无消息丢失配置
  • 人体的数学美思考
  • winfrom 水晶报表制作
  • 洛谷 P1454 圣诞夜的极光
  • 关于手势处理
  • ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
  • Centos运行Mysql因为内存不足进程被杀
  • BZOJ3529 [Sdoi2014]数表 【莫比乌斯反演】
  • JS 详解 Cookie、 LocalStorage 与 SessionStorage
  • 进程和线程(5)-分布式进程
  • LeetCode-13-roman-to-integer
  • 荣品i.mx6q飞思卡尔工业级核心板开发板高稳定性
  • SoapUI使用中遇到的问题及解决办法
  • 【comparator, comparable】小总结
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Docker入门(二) - Dockerfile
  • EOS是什么
  • export和import的用法总结
  • java8-模拟hadoop
  • Java多线程(4):使用线程池执行定时任务
  • Joomla 2.x, 3.x useful code cheatsheet
  • Mithril.js 入门介绍
  • PAT A1092
  • python学习笔记 - ThreadLocal
  • tweak 支持第三方库
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Web标准制定过程
  • 产品三维模型在线预览
  • 关于springcloud Gateway中的限流
  • ------- 计算机网络基础
  • 浏览器缓存机制分析
  • 前端攻城师
  • 前端性能优化——回流与重绘
  • 全栈开发——Linux
  • 深入浅出webpack学习(1)--核心概念
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 提醒我喝水chrome插件开发指南
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #pragma once
  • (1)STL算法之遍历容器
  • (3)llvm ir转换过程
  • (C++17) optional的使用
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (七)Java对象在Hibernate持久化层的状态
  • (三)elasticsearch 源码之启动流程分析
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .net 简单实现MD5