一开始死磕sam,发现根本没法做。。。。。。

后来想了想,反正匹配子串的大部分不是sam就是 二分+hash啊,,,于是就想了想二分+hash,发现好像可以做啊!

就是假设我们要让 s1[1] 映射到s2 中的位置是 s2[i] ,那么这种情况的答案就很好算了,就是求一次lcp之后把第一个不匹配的钦定成匹配之后再一次lcp。

所以总的时间复杂度就是 O(N * log(N)) 啦。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll unsigned long long
  7. using namespace std;
  8. const int maxn=140005,BASE=2875;
  9. char s[maxn],S[maxn];
  10. ll h[maxn],H[maxn],ci[maxn];
  11. int n,m,ans;
  12.  
  13. inline bool EQ(int b,int B,int len){
  14. if(b+len-1>n||B+len-1>m) return 0;
  15. return h[b+len-1]-h[b-1]*ci[len]==H[B+len-1]-H[B-1]*ci[len];
  16. }
  17.  
  18. int main(){
  19. freopen("str.in","r",stdin);
  20. freopen("str.out","w",stdout);
  21.  
  22. scanf("%s%s",s+1,S+1),ci[0]=1;
  23. n=strlen(s+1),m=strlen(S+1);
  24. s[n+1]='6',n++,S[m+1]='~',m++;
  25.  
  26. for(int i=1;i<=n;i++) h[i]=h[i-1]*(ll)BASE+(ll)s[i];
  27. for(int i=1;i<=m;i++) H[i]=H[i-1]*(ll)BASE+(ll)S[i];
  28. for(int i=1;i<=max(n,m);i++) ci[i]=ci[i-1]*(ll)BASE;
  29.  
  30. for(int i=1;i<=m;i++){
  31. int l=0,r=n,mid,an;
  32. while(l<=r){
  33. mid=l+r>>1;
  34. if(EQ(1,i,mid)) l=mid+1,an=mid;
  35. else r=mid-1;
  36. }
  37.  
  38. if(an==n){
  39. ans=an;
  40. break;
  41. }
  42.  
  43. l=0,r=n-an-1;
  44. while(l<=r){
  45. mid=l+r>>1;
  46. if(EQ(an+2,i+an+1,mid)) l=mid+1,ans=max(ans,an+mid+1);
  47. else r=mid-1;
  48. }
  49. }
  50.  
  51. printf("%d\n",ans);
  52. return 0;
  53. }

  

某考试 T1 str的更多相关文章

  1. 考试T1总结(又CE?!)

    考试T1CE... 最近不适合考试 T1 扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题.歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海棠,但是如今都已枯萎 ...

  2. 某考试T1 game

    题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...

  3. 某考试 T1 arg

    题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 输入格式 第一行两个整数 n, m. 接下来一行 m 个整数, 表示 A. 输出格式 ...

  4. 某考试 T1 lcm

    把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b) ...

  5. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...

  6. 2019.2.14 考试T1 FFT

    \(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...

  7. 某考试 T1 fair (18.5.1版)

    转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于  C(n,n/2)/2 ...

  8. 某考试 T1 monopoly

    可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...

  9. 某考试 T1 Hello my friend

    Discription

随机推荐

  1. BZOJ 4247: 挂饰

    背包裸题 #include<cstdio> #include<algorithm> using namespace std; int F[2005]; struct node{ ...

  2. hadoop完全分布式集群的搭建

    集群配置: jdk1.8.0_161 hadoop-2.6.1 linux系统环境:Centos6.5 创建普通用户  dummy 准备三台虚拟机master,slave01,slave02 hado ...

  3. Java中BigInteger类型

    BigInteger是java.math包提供的处理大整数类型,实现了大整数的存储,四则运算,判断素数的方法,求幂,求模,求逆元,求最大公约数等方法.本文主要分析下BigInteger对于大整数的存储 ...

  4. 安装 Windows Server 2012 Active Directory 只读域控制器 (RODC)(级别 200)

    安装 Windows Server 2012 Active Directory 只读域控制器 (RODC)(级别 200) 适用对象:Windows Server 2012 本主题介绍如何创建分步的 ...

  5. linux环境搭建系列之Apache MQ安装

    1.创建文件夹 #mkdir MQ 2.解压 #tar -vxf apache-activemq-5.14.3-bin.tar.gz 3.进入解压后的目录 # cd apache-activemq-5 ...

  6. phpMyAdmin 4.7.x CSRF

    phpMyAdmin 4.7.x CSRF 场景:管理员登陆phpmyadmin之后,我试验了一下,发现只要是登陆session没有失效应该是都可以的, 利用,phpmyadmin可以通过get方式操 ...

  7. uncompyle2反编译python的.py文件

    前几天学用github,一不小心把a.py文件给删除了,由于1天没有提交,也无法找回.突然发现同a.py文件生成的编译文件a.pyc还在,逐去搜索一番反编译的方法. 查询得知python比较好的工具u ...

  8. [c++基础]3/5原则--拷贝构造函数+拷贝赋值操作符

    /* * main.cpp * * Created on: Apr 7, 2016 * Author: lizhen */ #include <iostream> #include &qu ...

  9. 使用xcache加速PHP运行

    XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接使用缓冲区已编 ...

  10. HDU——2089 不要62

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...