某考试 T1 str

一开始死磕sam,发现根本没法做。。。。。。
后来想了想,反正匹配子串的大部分不是sam就是 二分+hash啊,,,于是就想了想二分+hash,发现好像可以做啊!
就是假设我们要让 s1[1] 映射到s2 中的位置是 s2[i] ,那么这种情况的答案就很好算了,就是求一次lcp之后把第一个不匹配的钦定成匹配之后再一次lcp。
所以总的时间复杂度就是 O(N * log(N)) 啦。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define ll unsigned long long
using namespace std;
const int maxn=140005,BASE=2875;
char s[maxn],S[maxn];
ll h[maxn],H[maxn],ci[maxn];
int n,m,ans; inline bool EQ(int b,int B,int len){
if(b+len-1>n||B+len-1>m) return 0;
return h[b+len-1]-h[b-1]*ci[len]==H[B+len-1]-H[B-1]*ci[len];
} int main(){
freopen("str.in","r",stdin);
freopen("str.out","w",stdout); scanf("%s%s",s+1,S+1),ci[0]=1;
n=strlen(s+1),m=strlen(S+1);
s[n+1]='6',n++,S[m+1]='~',m++; for(int i=1;i<=n;i++) h[i]=h[i-1]*(ll)BASE+(ll)s[i];
for(int i=1;i<=m;i++) H[i]=H[i-1]*(ll)BASE+(ll)S[i];
for(int i=1;i<=max(n,m);i++) ci[i]=ci[i-1]*(ll)BASE; for(int i=1;i<=m;i++){
int l=0,r=n,mid,an;
while(l<=r){
mid=l+r>>1;
if(EQ(1,i,mid)) l=mid+1,an=mid;
else r=mid-1;
} if(an==n){
ans=an;
break;
} l=0,r=n-an-1;
while(l<=r){
mid=l+r>>1;
if(EQ(an+2,i+an+1,mid)) l=mid+1,ans=max(ans,an+mid+1);
else r=mid-1;
}
} printf("%d\n",ans);
return 0;
}
某考试 T1 str的更多相关文章
- 考试T1总结(又CE?!)
考试T1CE... 最近不适合考试 T1 扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题.歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海棠,但是如今都已枯萎 ...
- 某考试T1 game
题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...
- 某考试 T1 arg
题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 输入格式 第一行两个整数 n, m. 接下来一行 m 个整数, 表示 A. 输出格式 ...
- 某考试 T1 lcm
把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b) ...
- 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)
\(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...
- 2019.2.14 考试T1 FFT
\(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...
- 某考试 T1 fair (18.5.1版)
转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于 C(n,n/2)/2 ...
- 某考试 T1 monopoly
可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...
- 某考试 T1 Hello my friend
Discription
随机推荐
- Android通过AIDL和反射调用系统拨打电话和挂断电话
首先在项目中添加ITelephony.aidl文件,我的如下: /* * Copyright (C) 2007 The Android Open Source Project * * Licensed ...
- 如何排查Java内存泄漏?看完我给跪了!
没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理.这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品.让我解释一下. 当不 ...
- CMD命令简介
cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一般Wind ...
- 【Reverse Nodes in k-Group】cpp
题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...
- ios开发学习笔记003-流程控制和类型转换
流程控制 顺序结构.选择结构.循环结构 1.顺序结构 程序默认是顺序执行的. 2.选择结构 if选择语句 第一种情况 if(条件)//条件成立执行下面语句 { //语句 } 第二种情况 if(条件)/ ...
- 04 JVM是如何执行方法调用的(上)
重载和重写 重载:同一个类中定义名字相同的方法,但是参数类型或者参数个数必须不同. 重载的方法在编译过程中就可完成识别.具体到每一个方法的调用,Java 编译器会根据所传入参数的生命类型来选取重载方法 ...
- python 中单例模式
1.什么是单例模式: 单例模式是指一个类有且只有一个实例对象,创建一个实例对象后,再创建实例是返回上一次的对象引用.(简单的讲就是两个实例对象的ID相同,节省了内存空间) 2.单例模式的创建: 举例创 ...
- [已解决]Argument list too long如何处理?
Argument list too long 本质是需要处理的长度超过系统的长度,因此无法执行相关命令. 经过搜索发现了两种方法,思想都是将参数切分成小的段落进行执行. 法一:通过xargs传递参数 ...
- Spring 简单而强大的事务管理功能
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- HDU 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...