【题目链接】 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. 简单的实现树莓派的WEB控制

    最终效果如图: 用到的知识:Python Bottle HTML Javascript JQuery Bootstrap AJAX 当然还有 linux 我去,这么多--我还是一点一点说起吧-- 先贴 ...

  2. 黑马程序员-- C语言变量作用域与代码块

    这里通过变量作用域的两种错误用法来介绍一下C语言变量作用域 其次对代码块的使用进行了简单说明: #include <stdio.h> 1.变量的作用域(作用范围) 变量定义的那一行开始,直 ...

  3. C语言-字符编码转换:UTF与GB2312

    依赖库libiconv,libiconv库的交叉编译不做描述,网上很多 #include <stdio.h> #include <stdlib.h> #include < ...

  4. MFC非模态对话框销毁

    非模态对话框需要重载OnCanel方法, 并调用DestroyWindow, 且不能调用基类的OnCanel重载PostNcDestroy, 需要delete掉this指针 // Overrides  ...

  5. Dot模板的使用小结2

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  7. Java SSH框架学习(入门)

    SSH就是 struts+spring+hibernate 的一个集成框架,是java中一种流行的JAVA WEB 应用程序开源框架.由于我最熟悉的还是ASP.NET的的MVC和Python的Djan ...

  8. Java socket字节流传输的示例

    服务端server端: package com.yuan.socket; import java.io.*; import java.net.ServerSocket; import java.net ...

  9. Ubuntu下安装Mysql并使用

    一.在Ubuntu终端中输入 sudo apt-get install mysql-server 二.在安装中要设置root密码,自己输入即可,但必须要记住. 三.安装后可以使用命令检测是安装成功 s ...

  10. leetcode Integer to Roman python

    class Solution(object): def intToRoman(self, num): """ :type num: int :rtype: str &qu ...