原文链接https://www.cnblogs.com/zhouzhendong/p/CF109D.html

题目传送门 - CF109D

题意

  给定两个字符串 $a,b$ ,求一组 $i,j$ 使得 $f(a,i,j)=b$ 。如果无解输出 "-1 -1" ,如果多组解,输出 i 尽量大的;如果 i 相同,输出 j 尽量小的。

  其中 $f(s,i,j) = s[i+1 \cdots j-1] + r(s[0 \cdots i]) + r(s[j\cdots n-1])$ 。 $n$ 为串长。其中 $s[i\cdots j]$ 表示 串 $s$ 的 $i$ 至 $j$ 个位置构成的子串,+ 运算定义为字符串顺序拼接,$r(s)$ 表示 $s$ 翻转后得到的串。

  $|a|,|b| \leq 10^6$

题解

  那个最大最小问题不大,我们来看看如何找一组解。

  首先,讲 a 串翻转。则问题变成了 $r(a[i+1]\cdots a[j-1])+a[0\cdots i] + a[j\cdots n-1]=b$ 的 $(i,j)$ 。这个问题,只需要枚举 $j$ ,然后判定是否可以行即可。

  对于 $r(a[i+1]\cdots a[j-1])$ 与 $b$ 的最大匹配长度,可以二分 + 哈希。

  对于以 b 串第 $j-1$ 个位置结尾的子串中与 $a$ 的前缀的匹配长度最大为多少,直接 KMP 。

  如果这两个长度大于 $j-1$ ,那么就可行。

  那个什么最大最小的,随便弄一弄就好了。

  注意我们求出来的翻转后的 a 串的答案,最后还要变换一下。

代码

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int N=1000005*2;
char a[N],b[N];
int n,Next[N],len[N];
ULL Ha[N],Hb[N],Fac[N],T=233;
ULL Get_Hash(ULL *Ha,int L,int R){
if (L>R)
L=n*2-L+1,R=n*2-R+1;
return Ha[R]-Ha[L-1]*Fac[R-L+1];
}
void KMP(char *a,char *b,int n){
for (int i=2,k=0;i<=n;Next[i]=k+=(a[k+1]==a[i]),i++)
while (k>0&&a[k+1]!=a[i])
k=Next[k];
for (int i=1,k=0;i<=n;len[i]=k+=(a[k+1]==b[i]),i++)
while (k>0&&a[k+1]!=b[i])
k=Next[k];
}
int Get(int j){
int L=1,R=j-1,mid,k1=0;
while (L<=R){
mid=(L+R)>>1;
if (Get_Hash(Hb,1,mid)==Get_Hash(Ha,j-1,j-mid))
L=mid+1,k1=mid;
else
R=mid-1;
}
return k1+len[j-1]<j-1?-1:len[j-1];
}
int main(){
gets(a+1),gets(b+1);
n=strlen(a+1);
if (strlen(b+1)!=n)
return puts("-1 -1"),0;
reverse(a+1,a+n+1);
for (int i=n+1;i<=n*2;i++)
a[i]=a[n*2-i+1],b[i]=b[n*2-i+1];
KMP(a,b,n);
for (int i=Fac[0]=1;i<=n*2;i++){
Fac[i]=Fac[i-1]*T;
Ha[i]=Ha[i-1]*T+a[i];
Hb[i]=Hb[i-1]*T+b[i];
}
int ansi=10000000,ansj=10000000,d=-1;
for (d=n;d>1;d--)
if (a[d]!=b[d])
break;
for (int i=-1,j=d+1;j<=n&&!~i;j++)
if (~(i=Get(j)))
ansi=i,ansj=j;
if (ansj==10000000)
ansi=ansj=-1;
else
ansi=n-ansi,ansj=n-ansj;
printf("%d %d\n",ansj,ansi);
return 0;
}

  

Codeforces 109D String Transformation 字符串 哈希 KMP的更多相关文章

  1. 牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)

    链接:https://ac.nowcoder.com/acm/contest/308/E 来源:牛客网 tokitsukaze and Similar String 时间限制:C/C++ 2秒,其他语 ...

  2. 牛客练习赛33 E. tokitsukaze and Similar String (字符串哈希)

    题目链接:https://ac.nowcoder.com/acm/contest/308/E 题意:中文题 见链接 题解:哈希预处理(三哈希模板) #include <bits/stdc++.h ...

  3. - Power Strings (字符串哈希) (KMP)

    https://www.cnblogs.com/widsom/p/8058358.htm (详细解释) //#include<bits/stdc++.h> #include<vect ...

  4. Codeforces 1383C - String Transformation 2(找性质+状压 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 神奇的强迫症效应,一场只要 AC 了 A.B.D.E.F,就一定会把 C 补掉( 感觉这个 C 难度比 D 难度高啊-- 首先考虑对问题进 ...

  5. UVA - 11475 Extend to Palindrome —— 字符串哈希 or KMP or 后缀数组

    题目链接:https://vjudge.net/problem/UVA-11475 题意: 给出一个字符串,问在该字符串后面至少添加几个字符,使得其成为回文串,并输出该回文串. 题解: 实际上是求该字 ...

  6. Redis支持的数据类型及相应操作命令:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sorted set:有序集合)

    help 命令,3种形式: help 命令 形式 help @<group> 比如:help @generic.help @string.help @hash.help @list.hel ...

  7. Codeforces Round #543 (Div. 2) F dp + 二分 + 字符串哈希

    https://codeforces.com/contest/1121/problem/F 题意 给你一个有n(<=5000)个字符的串,有两种压缩字符的方法: 1. 压缩单一字符,代价为a 2 ...

  8. 【CodeForces】961 F. k-substrings 字符串哈希+二分

    [题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...

  9. PAT 甲级 1047 Student List for Course (25 分)(cout超时,string scanf printf注意点,字符串哈希反哈希)

    1047 Student List for Course (25 分)   Zhejiang University has 40,000 students and provides 2,500 cou ...

随机推荐

  1. minicom的配置和使用

    安装配置minicom--------------------------------------------------# lsmod | grep usbserial (如果直接使用串口线,而没有 ...

  2. 性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控【转】

    概述 本文我们将介绍如何使用JMeter+InfluxDB+Grafana打造压测可视化实时监控. 引言 我们很多时候在使用JMeter做性能测试,我们很难及时察看压测过程中应用的性能状况,总是需要等 ...

  3. axis1 创建service服务端 , axis1 客户端

    axis1 服务端配置 1.首先建立一个项目 axisTest 不需多说 2.在lib下放入需要的jar包  点击下载 :axis所需的jar包下载 3.然后需要在web.xml里面加入: <s ...

  4. VUE 生成二维码(qrcodejs)

    1. 概述 1.1 引入二维码生成模块 npm install qrcodejs2 --save 注意:此处安装qrcodejs2,安装依赖后可在main方法中进行全局引用设置,也可单独某个页面中进行 ...

  5. 40)django-常用过滤器

    一.形式:小写 {{ name | lower }} 二.过滤器是可以嵌套的,字符串经过三个过滤器,第一个过滤器转换为小写,第二个过滤器输出首字母,第三个过滤器将首字母转换成大写 标签 {{ str| ...

  6. Codeforces Educational Codeforces Round 57 题解

    传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...

  7. 2018 github热门项目

    github流行的几个项目,我们来学习一下. 1. developer-roadmap-chinese image.png 项目简介:2018年web程序员路线中文版, 这个仓库里包含了一些前端,后端 ...

  8. struts2 过滤器和拦截器的区别和使用

    java web 过滤器和拦截器的区别和使用  1.1 什么是拦截器:      拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然 ...

  9. Confluence 6 嵌入的 H2 数据库

    为了让你的 Confluence 在安装成功后就可以使用而不需要使用任何外部的数据库,Confluence 使用一个嵌入的 H2 数据库. 当你选择对 Confluence 进行评估和测试的时候,H2 ...

  10. Linux 用户切换、修改用户名、修改密码

    一.用户切换 "$":普通用户提示符 "#":root用户提示符 1.普通用户到root: 方式一:命令:su然后输入root密码 此种方式只是切换了root身 ...