【题目链接】 http://poj.org/problem?id=2758

【题目大意】

  给出一个字符串,支持两个操作,在任意位置插入一个字符串,或者查询两个位置往后的最长公共前缀,注意查询的时候是原串下标,插入的时候则是最近更新串的下标。

【题解】

  因为插入操作只有两百次,所以考虑hash重构来处理匹配问题,碰到插入就重构插入点往后的哈希表,否则二分两个位置往后的匹配长度,查hash表判断是否可行。

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=60000,base=233;
typedef long long ll;
int len,n,m,pos[N],x,y;
ll hash[N],p[N];
char s[N],op[10];
void Build(int x){for(int i=x;i<=len;i++)hash[i]=hash[i-1]*base+s[i];}
ll get_hash(int L,int R){return hash[R]-hash[L-1]*p[R-L+1];}
int query(int x,int y){
int l=0,r=len-max(x,y)+1;
while(l<=r){
int mid=l+r>>1;
if(get_hash(x,x+mid-1)==get_hash(y,y+mid-1))l=mid+1;
else r=mid-1;
}return r;
}
int main(){
for(int i=p[0]=1;i<N;i++)p[i]=p[i-1]*base;
scanf("%s",s+1); n=len=strlen(s+1);
scanf("%d",&m); Build(1);
for(int i=1;i<=n;i++)pos[i]=i;
for(int i=1;i<=m;i++){
scanf("%s",op);
if(op[0]=='I'){
scanf("%s%d",op,&x);
if(x>len)x=len+1;
memcpy(s+x+1,s+x,(len-x+1)*sizeof(char));
s[x]=op[0];
for(int j=n;j>=1;j--){
if(pos[j]>=x)pos[j]++;
else break;
}len++; Build(x);
}else{
scanf("%d%d",&x,&y);
printf("%d\n",query(pos[x],pos[y]));
}
}return 0;
}

  

POJ 2758 Checking the Text(Hash+二分答案)的更多相关文章

  1. 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774

    Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...

  2. POJ 1226 Substrings(后缀数组+二分答案)

    [题目链接] http://poj.org/problem?id=1226 [题目大意] 求在每个给出字符串中出现的最长子串的长度,字符串在出现的时候可以是倒置的. [题解] 我们将每个字符串倒置,用 ...

  3. poj 3294 Life Forms - 后缀数组 - 二分答案

    题目传送门 传送门I 传送门II 题目大意 给定$n$个串,询问所有出现在严格大于$\frac{n}{2}$个串的最长串.不存在输出'?' 用奇怪的字符把它们连接起来.然后求sa,hei,二分答案,按 ...

  4. poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 给定串$A, B$,求$A$和$B$长度大于等于$k$的公共子串的数量. 根据常用套路,用一个奇怪的字符把$A$,$B$连接起来,然后二分答案,然后按mid ...

  5. Poj 1743 Musical Theme(后缀数组+二分答案)

    Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...

  6. Poj 3261 Milk Patterns(后缀数组+二分答案)

    Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ...

  7. POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)

    $ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...

  8. POJ 2774 Long Long Message (Hash + 二分)

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 34473   Accepted: 13 ...

  9. poj 1275 Cashier Employment - 差分约束 - 二分答案

    A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit its n ...

随机推荐

  1. leetcode Letter Combinations of a Phone Number python

    class Solution(object): def letterCombinations(self, digits): """ :type digits: str : ...

  2. Socket 服务器和客户端通信

    //服务器端package com.svse.service; import java.io.BufferedReader; import java.io.IOException; import ja ...

  3. javaScript的2种变量范围有什么不同

    1.javascript怎样选中一个checkbox,怎样设置它无效? document.all.cb1[0].disabled = true;   2.js中的3种弹出式消息提醒(警告窗口,确认窗口 ...

  4. python递归函数下不能正常使用yield

    # -*- coding:utf-8 -*- import os import time file_list = [] def findFile(path): listFile = os.listdi ...

  5. C#BASE64 UTF8字符串加密解密

    base 64 解码 base64 bb = new base64(); string orgStr= Encoding.Default.GetString(bb.GetDecoded("b ...

  6. Generator & Co

    Generator 搬运自 http://es6.ruanyifeng.com/#docs/generator 如果没有babel等环境也可以在线体验 可以在http://www.es6fiddle. ...

  7. SQL Server MySQL 中的 in 与 null

    例子: create table t(x int,y int); insert into t(x,y) values(1,1),(2,2),(null,null); 查询一: select x,y f ...

  8. VIM+qmake编译示例程序HelloQt出错问题的解决(文件名一定要使用.cpp,否则就会默认使用gcc编译,当然通不过)

    之前看到很多初学Qt的Linux友们在使用qmake编译第一个HelloQt或者HelloWorld程序时报错,并且始终找不到原因. 前几天我也遇到了同样的问题,我用的是<精通Qt4编程> ...

  9. 【转】stdin, stdout, stderr 以及重定向

    详细见: http://my.oschina.net/qihh/blog/55308 stdin是标准输入文件,stdout是标准输出文件,stderr标准出错文件. 程序按如下方式使用这些文件: 标 ...

  10. ZooKeeper源码阅读(二):客户端

    源代码: http://svn.apache.org/repos/asf/zookeeper/trunk/ 导入eclipse: 在包含build.xml目录下执行ant eclipse将产生.cla ...