poj-2758 Checking the Text
题意:
给定一个字符串,要求维护两种操作:
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的更多相关文章
- POJ 2758 Checking the Text(Hash+二分答案)
[题目链接] http://poj.org/problem?id=2758 [题目大意] 给出一个字符串,支持两个操作,在任意位置插入一个字符串,或者查询两个位置往后的最长公共前缀,注意查询的时候是原 ...
- poj 2758 && BZOJ 2258 Checking the Text 文本校对
Description 为了给Wind买生日礼物,Jiajia不得不找了一份检查文本的工作.这份工作很无聊:给你一段文本 要求比对从文本中某两个位置开始能匹配的最大长度是多少.但比无聊更糟糕的是, ...
- POJ2758 Checking the Text 哈希
注意到插入次数挺少的,于是每次暴力重构,然后哈希+二分 #include<cstdio> #include<iostream> #include<algorithm> ...
- POJ2758 Checking the Text
题目链接:https://vjudge.net/problem/POJ-2758 题目大意: 先给出一串原始字符串,在此基础上执行两种操作: 1.在第 p 个字符前添加字符 ch,如果 p 比现字符串 ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- kuangbin带你飞 后缀数组 题解
2份模板 DC3 . 空间复杂度O3N 时间复杂度On #define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb)) #define G(x) ((x) < ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- ACM--[kuangbin带你飞]--专题1-23
专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- Ubuntu下使用crontab部署定时任务
Ubuntu下使用crontab部署定时任务 安装cron apt-get install cron 开启crontab日志 默认情况下的日志是没有开启的,我们需要找到 /etc/rsyslog.d/ ...
- php获取时间是星期几
PHP星期几获取代码: date("l"); //data就可以获取英文的星期比如Sundaydate("w"); //这个可以获取数字星期比如123,注意0是 ...
- Jquery_Validate 表单校验的使用
一.效果图: 二.JqueryValidate的好处 在做注册.或者类似以上的表单提交的时候,大家是不是都很烦那种,把数据拿到后台去判断, 可能经过了正则表达式之类的复杂判断,然后发现数据错误.接着通 ...
- HDU 4828
其实..这题是<组合数学>的习题中的一道......当初不会..... 想到一个证明: 填入2n个数,把填在上方的数的位置填上+1,下方的填上-1.这样,在序列1....2n的位置,任意前 ...
- 【转载】黑客内核:编写属于你的第一个Linux内核模块
黑客内核:编写属于你的第一个Linux内核模块
- java语言中的多态概述
多态:一个对象相应着不同类型 多态在代码中的体现:父类或接口的引用指向其子类对象. 多态的优点: 提高了代码的扩展性,前期定义的代码能够使用后期的内容. 多态的弊端: 前期定义的内容不能使用后期子类中 ...
- 1.RunLoop是什么?
1.Run loops是线程相关的的基础框架的一部分. 一个run loop就是一个事件处理的循环.用来不停的调度工作以及处理输入事件.使用run loop的目的是让你的线程在有工作的时候忙于工作.而 ...
- CoreData 从入门到精通(六)模型版本和数据迁移
前面几篇文章中讲的所有内容,都是在同一个模型版本上进行操作的.但在真实开发中,基本上不会一直停留在一个版本上,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模 ...
- javaScript常用知识点有哪些
javaScript常用知识点有哪些 一.总结 一句话总结:int = ~~myVar, // to integer | 是二进制或, x|0 永远等于x:^为异或,同0异1,所以 x^0 还是永远等 ...
- nyoj--2--括号配对问题(栈函数)
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100), ...