题意:

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

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

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

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

题解:

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

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

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

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

复杂度O(mlogn+100n);

单组数据。稍微卡常;

代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #define N 51000
  5. #define mod 1000000009ll
  6. using namespace std;
  7. typedef unsigned long long ull;
  8. int p[N],len;
  9. char str[N],op[10];
  10. ull hash[N],pow[N];
  11. void Build(int x)
  12. {
  13. for(int i=x;i<=len;i++)
  14. hash[i]=(hash[i-1]*131+str[i])%mod;
  15. }
  16. int query(int x,int y)
  17. {
  18. int l=0,r=len-max(x,y)+1;
  19. while(l<=r)
  20. {
  21. int mid=l+r>>1;
  22. if((hash[x+mid-1]-hash[x-1]*pow[mid]%mod+mod)%mod==
  23. (hash[y+mid-1]-hash[y-1]*pow[mid]%mod+mod)%mod)
  24. l=mid+1;
  25. else
  26. r=mid-1;
  27. }
  28. return r;
  29. }
  30. int main()
  31. {
  32. int n,m,i,j,k,x,y;
  33. pow[0]=1;
  34. for(i=1;i<N;i++)
  35. pow[i]=pow[i-1]*131%mod;
  36. scanf("%s",str+1);
  37. n=len=strlen(str+1);
  38. scanf("%d",&m);
  39. Build(1);
  40. for(i=1;i<=n;i++)
  41. p[i]=i;
  42. for(i=1;i<=m;i++)
  43. {
  44. scanf("%s",op);
  45. if(op[0]=='I')
  46. {
  47. scanf("%s%d",op,&x);
  48. if(x>len) x=len+1;
  49. memcpy(str+x+1,str+x,sizeof(char)*(len-x+1));
  50. str[x]=op[0];
  51. for(j=n;j>=1;j--)
  52. {
  53. if(p[j]>=x)
  54. p[j]++;
  55. else
  56. break;
  57. }
  58. len++;
  59. Build(x);
  60. }
  61. else
  62. {
  63. scanf("%d%d",&x,&y);
  64. printf("%d\n",query(p[x],p[y]));
  65. }
  66. }
  67. return 0;
  68. }

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. Ubuntu下使用crontab部署定时任务

    Ubuntu下使用crontab部署定时任务 安装cron apt-get install cron 开启crontab日志 默认情况下的日志是没有开启的,我们需要找到 /etc/rsyslog.d/ ...

  2. php获取时间是星期几

    PHP星期几获取代码: date("l"); //data就可以获取英文的星期比如Sundaydate("w"); //这个可以获取数字星期比如123,注意0是 ...

  3. Jquery_Validate 表单校验的使用

    一.效果图: 二.JqueryValidate的好处 在做注册.或者类似以上的表单提交的时候,大家是不是都很烦那种,把数据拿到后台去判断, 可能经过了正则表达式之类的复杂判断,然后发现数据错误.接着通 ...

  4. HDU 4828

    其实..这题是<组合数学>的习题中的一道......当初不会..... 想到一个证明: 填入2n个数,把填在上方的数的位置填上+1,下方的填上-1.这样,在序列1....2n的位置,任意前 ...

  5. 【转载】黑客内核:编写属于你的第一个Linux内核模块

    黑客内核:编写属于你的第一个Linux内核模块

  6. java语言中的多态概述

    多态:一个对象相应着不同类型 多态在代码中的体现:父类或接口的引用指向其子类对象. 多态的优点: 提高了代码的扩展性,前期定义的代码能够使用后期的内容. 多态的弊端: 前期定义的内容不能使用后期子类中 ...

  7. 1.RunLoop是什么?

    1.Run loops是线程相关的的基础框架的一部分. 一个run loop就是一个事件处理的循环.用来不停的调度工作以及处理输入事件.使用run loop的目的是让你的线程在有工作的时候忙于工作.而 ...

  8. CoreData 从入门到精通(六)模型版本和数据迁移

    前面几篇文章中讲的所有内容,都是在同一个模型版本上进行操作的.但在真实开发中,基本上不会一直停留在一个版本上,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模 ...

  9. javaScript常用知识点有哪些

    javaScript常用知识点有哪些 一.总结 一句话总结:int = ~~myVar, // to integer | 是二进制或, x|0 永远等于x:^为异或,同0异1,所以 x^0 还是永远等 ...

  10. nyoj--2--括号配对问题(栈函数)

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100), ...