题意:

给定一个字符串,要求维护两种操作:

I:在字符串中插入一个字符;

Q:询问某两个位置開始的LCP。

插入操作<=200,字符串长度<=5w,查询操作<=2w;

题解:

第一道RKhash题,插入太少让这题变成了傻题;

注意题中描写叙述的各种恶心的下标讨论;

插入下标是当前下标。而查询是原下标;

查询就是二分答案,利用RKhash高速合并的性质搞搞。

复杂度O(mlogn+100n);

单组数据。稍微卡常;

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 51000
#define mod 1000000009ll
using namespace std;
typedef unsigned long long ull;
int p[N],len;
char str[N],op[10];
ull hash[N],pow[N];
void Build(int x)
{
for(int i=x;i<=len;i++)
hash[i]=(hash[i-1]*131+str[i])%mod;
}
int query(int x,int y)
{
int l=0,r=len-max(x,y)+1;
while(l<=r)
{
int mid=l+r>>1;
if((hash[x+mid-1]-hash[x-1]*pow[mid]%mod+mod)%mod==
(hash[y+mid-1]-hash[y-1]*pow[mid]%mod+mod)%mod)
l=mid+1;
else
r=mid-1;
}
return r;
}
int main()
{
int n,m,i,j,k,x,y;
pow[0]=1;
for(i=1;i<N;i++)
pow[i]=pow[i-1]*131%mod;
scanf("%s",str+1);
n=len=strlen(str+1);
scanf("%d",&m);
Build(1);
for(i=1;i<=n;i++)
p[i]=i;
for(i=1;i<=m;i++)
{
scanf("%s",op);
if(op[0]=='I')
{
scanf("%s%d",op,&x);
if(x>len) x=len+1;
memcpy(str+x+1,str+x,sizeof(char)*(len-x+1));
str[x]=op[0];
for(j=n;j>=1;j--)
{
if(p[j]>=x)
p[j]++;
else
break;
}
len++;
Build(x);
}
else
{
scanf("%d%d",&x,&y);
printf("%d\n",query(p[x],p[y]));
}
}
return 0;
}

poj-2758 Checking the Text的更多相关文章

  1. POJ 2758 Checking the Text(Hash+二分答案)

    [题目链接] http://poj.org/problem?id=2758 [题目大意] 给出一个字符串,支持两个操作,在任意位置插入一个字符串,或者查询两个位置往后的最长公共前缀,注意查询的时候是原 ...

  2. poj 2758 && BZOJ 2258 Checking the Text 文本校对

    Description   为了给Wind买生日礼物,Jiajia不得不找了一份检查文本的工作.这份工作很无聊:给你一段文本 要求比对从文本中某两个位置开始能匹配的最大长度是多少.但比无聊更糟糕的是, ...

  3. POJ2758 Checking the Text 哈希

    注意到插入次数挺少的,于是每次暴力重构,然后哈希+二分 #include<cstdio> #include<iostream> #include<algorithm> ...

  4. POJ2758 Checking the Text

    题目链接:https://vjudge.net/problem/POJ-2758 题目大意: 先给出一串原始字符串,在此基础上执行两种操作: 1.在第 p 个字符前添加字符 ch,如果 p 比现字符串 ...

  5. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  6. kuangbin带你飞 后缀数组 题解

    2份模板 DC3 . 空间复杂度O3N 时间复杂度On #define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb)) #define G(x) ((x) < ...

  7. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  8. ACM--[kuangbin带你飞]--专题1-23

    专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. KMP算法题集

    模板 caioj 1177 KMP模板 #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = (a); i & ...

  2. springboot项目封装为docker镜像

    1.本次镜像的基础镜像是:https://www.cnblogs.com/JoeyWong/p/9173265.html 2.将打包好的项目文件放在与Dockerfile同级的目录下 3.Docker ...

  3. C/C++ 名正则言顺

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50532701 名称所表达的含义极其丰富 ...

  4. MySQL 创建表时,设置时间字段自己主动插入当前时间

    MySQL 创建表时,设置时间字段自己主动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) N ...

  5. Tokyo Tyrant(TTServer)系列(二)-启动參数和配置

    启动參数介绍         ttserver命令能够启动一个数据库实例.由于数据库已经实现了Tokyo Cabinet的抽象API,所以能够在启动的时候指定数据库的配置类型. 支持的数据库类型有: ...

  6. 【Android】桌面歌词悬浮效果简单实现

    在使用"网易云音乐"的时候,发现有一个显示"桌面歌词"的功能,于是就想着自己实现下.查了下资料,是用WindowManage实现的.实现过程中也出现了些问题,看 ...

  7. log4j.propertie配置具体解释

    1.log4j.rootCategory=INFO, stdout , R 此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在以下的代码,能够随意起名.等级可 ...

  8. java.lang.ClassNotFoundException: org.jaxen.JaxenException

    java.lang.ClassNotFoundException: org.jaxen.JaxenException java.lang.ClassNotFoundException: org.jax ...

  9. Android上方便地开发的C程序

    假设你基于没有一个专门的开发板练手.那你的Android手机也能够开发大多数C应用程序.安装好后编译C的编译器. 本文仅仅写一个Hello World的执行过程. 长处是:不须要eclipse,不须要 ...

  10. android 处理Back键按下事件

    package com.example.keyevent; import android.os.Bundle; import android.view.KeyEvent; import android ...