原文链接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. 【原创】大叔经验分享(35)lzo格式支持

    建表语句 CREATE EXTERNAL TABLE `my_lzo_table`(`something` string)ROW FORMAT DELIMITED FIELDS TERMINATED ...

  2. sql拼接显示table的多个列

    SELECT DeptName AS text,CONVERT(VARCHAR(10),ID)+','+DeptCode+','+ISNULL(Remark,'') AS tags,'' AS hre ...

  3. JGroups

    JGroups Developer(s) Bela Ban Stable release 4.0.10.Final / February 1, 2018 Written in Java Operati ...

  4. 加载UI工程的csb,以及纹理缓存情况

    以plist+PNG模式加载csb,并播放UI工程做的动画,用法如下 local Layer = cc.CSLoader:createNode("res/yk/interface/loadi ...

  5. LuoGu P2735 电网 Electric Fences

    题目传送门 这个东西,本来我是用求出两条一次函数解析式然后判断在x坐标下的y坐标值来做的 首先因为没考虑钝角三角形,WA了 然后又因为精度处理不好又WA了 一气之下,只能去网上查了查那个皮克定理 首先 ...

  6. 机器学习之高斯混合模型及EM算法

    第一部分: 这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类 ...

  7. Confluence 6 服务器的许可证信息

    Confluence 6 服务器的许可证信息. https://www.cwiki.us/display/CONFLUENCEWIKI/Managing+your+Confluence+License

  8. Confluence 6 包括从其他 Confluence 服务器上来的通知

    Confluence workbox 可以显示从 Confluence 服务器上发送过来的消息. 让我们假设你有 2 个 Confluence 服务器, ConfluenceChatty 和 Conf ...

  9. 如何使用PowerShell批量删除Office 365的用户

    概述 本文将演示如何在必要的时候(例如在测试环境),通过PowerShell脚本批量删除Office 365的用户,首先需要通过Get-MsolUser的命令(并且配合筛选条件)获取到符合条件的用户列 ...

  10. linux更好看的top界面htop

    top命令界面 性能测试时会经常用到top命令百用百顺就是样式不太美,下面介绍htop一个看起来更漂亮的top界面 安装htop yum install htop 安装完成键入htop命令,这样看起来 ...