【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

在做之前需要了解一个知识点。
就是如果一个字符串s是一个a循环串。
(字符串的长度设为n,下标从1开始
那么s[1..n-a]和s[1+a..n]是相同的.
且这是充分必要条件。
可以看这篇文章 [链接](http://blog.sina.com.cn/s/blog_7981299401012xl0.html)
显然1..n-a就对应了文章中的**黄色部分**,而1+a..n对应了**蓝色部分**。
根据文章中的描述。显然如果这两部分相同。则它是长度为a的一个循环串。
(且**就算n不是a的倍数**,那种情况**也能用这种方法**判断

则我们的问题转化成快速判断某两段区间的字符串是否相同。

需要用到字符串hash的知识。

比如字符串

12343

它的hash值为\(1*base^0 + 2*base^1+3*base^2+4*base^3+3*base^4\)

显然如果太大了,这个值是会爆long long的。

但是没关系。

我们直接把它对一个数字MOD取模就好了。

这样我们就能用一个<MOD的数字唯一对应一段字符串了。

我们可以用线段树维护每一段字符串的hash值。

1操作就是线段树的成段更新。(预处理出\(base^{l-1}+base^l+base^{l+1}...base^{r}\)(前缀和),然后到了那段

区间直接让hash值等于c*(sum[r]-sum[l])就可以了。

2操作就是取出两段的区间的hash值,然后因为第一段是1..n-a,第二段是1+a..n,所以第二段整体的幂会比第一段多a,所以第一段的hash要再乘上base^a;

比较一下就好。

(据说卡1e9+7的模数

【代码】

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define lson l,mid,rt<<1
  4. #define rson mid+1,r,rt<<1|1
  5. using namespace std;
  6. const int N = 1e5+10;
  7. const ll MOD = 1998000219;
  8. const ll BASE = 12;
  9. ll _pow[N],_sum[N];
  10. int n,m,k;
  11. ll lazy_tag[N<<2],_hash[N<<2];
  12. string s;
  13. ll _Get(int l,int r){
  14. l--,r--;
  15. if (l==0) return _sum[r];
  16. else{
  17. return (_sum[r]-_sum[l-1]+MOD)%MOD;
  18. }
  19. }
  20. void _pushdown(int rt,int l,int r){
  21. if (lazy_tag[rt]==0) return;
  22. int mid = (l+r)>>1;
  23. if (l!=r){
  24. _hash[rt<<1] = 1LL*lazy_tag[rt]*_Get(l,mid)%MOD;
  25. _hash[rt<<1|1] = 1LL*lazy_tag[rt]*_Get(mid+1,r)%MOD;
  26. lazy_tag[rt<<1] = lazy_tag[rt<<1|1] = lazy_tag[rt];
  27. }
  28. lazy_tag[rt] = 0;
  29. }
  30. void _modify(int num,int L,int R,int l,int r,int rt){
  31. if (L<=l && r<=R){
  32. _hash[rt] = 1LL*num*_Get(l,r)%MOD;
  33. lazy_tag[rt] = num;
  34. return;
  35. }
  36. _pushdown(rt,l,r);
  37. int mid = (l+r)>>1;
  38. if (L<=mid) _modify(num,L,R,lson);
  39. if (mid<R) _modify(num,L,R,rson);
  40. _hash[rt] = (_hash[rt<<1]+_hash[rt<<1|1])%MOD;
  41. }
  42. ll _get(int L,int R,int l,int r,int rt){
  43. if(L<=l && r<=R) return _hash[rt];
  44. int mid = (l+r)>>1;
  45. ll temp = 0;
  46. _pushdown(rt,l,r);
  47. if (L<=mid) temp = _get(L,R,lson);
  48. if (mid<R) temp=(temp + _get(L,R,rson))%MOD;
  49. return temp;
  50. }
  51. int main()
  52. {
  53. ios::sync_with_stdio(0),cin.tie(0);
  54. #ifdef LOCAL_DEFINE
  55. freopen("rush.txt","r",stdin);
  56. #endif
  57. cin >> n >> m >> k;
  58. m+=k;
  59. cin >> s;
  60. _pow[0] = 1;
  61. _sum[0] = 1;
  62. for (int j = 1;j <=n;j++){
  63. _pow[j] = _pow[j-1]*BASE%MOD;
  64. _sum[j] = (_sum[j-1]+_pow[j])%MOD;
  65. }
  66. for (int i = 0;i <n;i++){
  67. _modify(s[i]-'0'+1,i+1,i+1,1,n,1);
  68. }
  69. while (m--){
  70. int ope,l,r,num;
  71. cin >>ope>>l>>r>>num;
  72. if (ope==1){
  73. _modify(num+1,l,r,1,n,1);
  74. }else{
  75. if ((r-l+1)==num || _get(l,r-num,1,n,1)*_pow[num]%MOD==
  76. _get(l+num,r,1,n,1))
  77. cout<<"YES"<<endl;
  78. else
  79. cout<<"NO"<<endl;
  80. }
  81. }
  82. return 0;
  83. }

【Henu ACM Round#14 E】Kefa and Watch的更多相关文章

  1. 【Henu ACM Round#14 D】Kefa and Dishes

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 状态压缩动规. 可以写成记忆化搜索的形式. f[bit][p] 表示选取的菜的情况为bit(用0..2^(N)-1的二进制形式表示各 ...

  2. 【Henu ACM Round#14 F】 President and Roads

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到 ...

  3. 【Henu ACM Round#14 C】Duff and Weight Lifting

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 2^y可以由两个2^(y-1)相加得到. 则有一个贪心的策略. 就是2^x尽量都变成2^(x+1) (即能够凑就尽量凑) 如果x还有 ...

  4. 【Henu ACM Round#14 B】Duff in Love

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让你在n的因子里面找一个最大的数字x 且x的因子全都不是完全平方数(y^2,y>1) O(sqrt(n))找出n的所有因子. ...

  5. 【Henu ACM Round#14 A】Vitaly and Night

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 连续两个如果不全是0就递增cnt [代码] #include <bits/stdc++.h> using namespa ...

  6. 【Henu ACM Round#24 E】Connected Components

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 要求把连续的一段li..ri的边全都删掉. 然后求剩下的图的联通数 如果暴力的话 复杂度显然是O(k*m)级别的. 考虑我们把li. ...

  7. 【Henu ACM Round#24 D】Iterated Linear Function

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一 ...

  8. 【Henu ACM Round#24 C】Quiz

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 肯定是这样 先放k-1个,然后空1个,然后再放k-1个.然后再空1个.. 以此类推. 然后如果(n/k)*(k-1)+n%k> ...

  9. 【Henu ACM Round#24 B】Gargari and Bishops

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果写过n皇后问题. 肯定都知道 某个点(i,j)和它在同一条对角线上的点分别是i+j的值和i-j的值相同的点. 然后会发现选择的两 ...

随机推荐

  1. YII进行数据查询及类库追踪

    一般处理过程: 模型进行数据操作,继承自CActiveRecord (活跃记录) AR数据库向上的封装.AR通过OOP面向对象方式操作数据库.AR须要终于转变为详细的sql语句.通过一个中间类(cri ...

  2. Linux下安装过程中编译PHP时报错:configure: error: libjpeg.(a|so) not found

    在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决的方法: 检查之后发现已经安装libjpeg.可是/usr/l ...

  3. 关于nth-of-type和nth-child的关系

    一开始写样式的时候喜欢全部元素都来个class,后面发现这样一个页面下来很多个class,起名字起到发慌,然后老师说该多用 逻辑关系来写样式,就是这种第几个孩子啊这种,不知道你们有没有这种烦恼,要用的 ...

  4. AngularJs轻松入门源码托管至Github

    Github是全球最大的代码托管平台,笔者玩Github有一段时间了,有很多开源项目的源码都托管在Github上,笔者在上面也发现了不少优秀的开源代码. 每次写完博文想在最后附上文章相关的代码,但是由 ...

  5. RMAN备份脚本--DataGuard primary

    单机环境全备   export ORACLE_BASE=/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORACL ...

  6. Qihoo 360 altas 实践

    Qihoo 360 altas 实践 简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Prox ...

  7. webpack简短版零工程构建项目(二)

    webpack使用总结 1.初始化一个项目 npm init -y 之后会生成一个package.json配置文件. 2.安装webpack,vue,vue-loader npm install we ...

  8. 【noip2016】蚯蚓(单调性+队列)

    题目贼长 大意是你有n个线段,每一秒你要拿出来最长的一个线段切成两段长度为[p*u](向下取整)和u-[p*u]两段(其中u是线段长,p是一个大于0小于1的实数)没被切的线段长度加q(0<q&l ...

  9. css与jquery、图标字体

    *)还能这样选择 header #search input[type="text"] *)按钮常用颜色:#008cBA(字母大小写没有区别) *)清除浮动后,text-align没 ...

  10. IIS集成和经典配置

    检測到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式).  我们将ASP.NET程序从IIS6移植到IIS7,可能执行提示下面错误: HTTP 错误 500. ...