题目

分析

我们发现当两个字符串合并时,a0a1表示左右两个字符串中有多少个TC表示合并处新增的T的个数,那么

a0=a1

a1=a0+a1+C

s0s1表示左右手两个字符串,那么每一次操作后左右手字符串分别为:

  1. 操作次数 左手 右手
  2. 0 s0 s1
  3. 1 s1 s0s1
  4. 2 s0s1 s1s0s1
  5. 3 s1s0s1 s0s1s1s0s1
  6. 4 s0s1s1s0s1 s1s0s1s0s1s1s0s1
  7. 5 s1s0s1s0s1s1s0s1 s0s1s1s0s1s1s0s1s0s1s1s0s1
  8. ···

然后我们发现,从第1次操作以后,每次合并处是以s1s1s1s0为一个循环。也就是说当|s0|>=m-1时,我们用KMP处理出a0a1以及s1s1s1s0合并时新增T的个数,然后O(N)递推一遍就可以了。

但是n<=10^9,只能拿60分。

因为递推时有循环,所以就可以构造矩阵,打个矩阵快速幂O(logN)。

  1. #include <cmath>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <queue>
  8. const long long maxlongint=2147483647;
  9. using namespace std;
  10. char s[30000],s1[30000],s2[30000],t[30000];
  11. long long n,m,tot,ans,mo,next[30000],f[2][5],lens=1,lens1=1,nn,nnn;
  12. long long jz[5][5]=
  13. {
  14. {0,0,0,0,0},
  15. {0,1,1,0,0},
  16. {0,1,2,0,0},
  17. {0,1,1,1,0},
  18. {0,0,1,0,1}
  19. },b[5][5];
  20. long long getnext()
  21. {
  22. long long i,j,k;
  23. j=0;
  24. for(i=2;i<=m;i++)
  25. {
  26. while(j>0 && t[j+1]!=t[i]) j=next[j];
  27. if(t[j+1]==t[i]) j++;
  28. next[i]=j;
  29. }
  30. }
  31. long long kmp()
  32. {
  33. long long i,j,k;
  34. getnext();
  35. j=0;
  36. for(i=1;i<=lens;i++)
  37. {
  38. while(j>0 && t[j+1]!=s[i]) j=next[j];
  39. if(t[j+1]==s[i]) j++;
  40. if(j==m) f[0][1]++;
  41. }
  42. j=0;
  43. for(i=1;i<=lens1;i++)
  44. {
  45. while(j>0 && t[j+1]!=s1[i]) j=next[j];
  46. if(t[j+1]==s1[i]) j++;
  47. if(j==m) f[0][2]++;
  48. }
  49. }
  50. long long kmp1()
  51. {
  52. long long i,j,k;
  53. k=0;
  54. for(i=lens-m+2;i<=lens;i++)
  55. s2[++k]=s[i];
  56. for(i=1;i<=m-1;i++)
  57. s2[++k]=s1[i];
  58. j=0;
  59. for(i=1;i<=m+m-2;i++)
  60. {
  61. while(j>0 && t[j+1]!=s2[i]) j=next[j];
  62. if(t[j+1]==s2[i]) j++;
  63. if(j==m) f[0][0]++;
  64. }
  65. k=0;
  66. for(i=lens1-m+2;i<=lens1;i++)
  67. s2[++k]=s1[i];
  68. for(i=1;i<=m-1;i++)
  69. s2[++k]=s[i];
  70. j=0;
  71. for(i=1;i<=m+m-2;i++)
  72. {
  73. while(j>0 && t[j+1]!=s2[i]) j=next[j];
  74. if(t[j+1]==s2[i]) j++;
  75. if(j==m) f[0][3]++;
  76. }
  77. k=0;
  78. for(i=lens1-m+2;i<=lens1;i++)
  79. s2[++k]=s1[i];
  80. for(i=1;i<=m-1;i++)
  81. s2[++k]=s1[i];
  82. j=0;
  83. for(i=1;i<=m+m-2;i++)
  84. {
  85. while(j>0 && t[j+1]!=s2[i]) j=next[j];
  86. if(t[j+1]==s2[i]) j++;
  87. if(j==m) f[0][4]++;
  88. }
  89. }
  90. long long mi()
  91. {
  92. long long x=0,y=1,i,j,k;
  93. while(nn>0)
  94. {
  95. if(nn&1==1)
  96. {
  97. for(i=1;i<=4;i++)
  98. {
  99. f[x][i]=0;
  100. for(j=1;j<=4;j++)
  101. f[x][i]=(f[x][i]+(f[y][j]*jz[j][i])%mo)%mo;
  102. }
  103. x=y;
  104. y=1-y;
  105. }
  106. for(i=1;i<=4;i++)
  107. for(j=1;j<=4;j++)
  108. {
  109. b[i][j]=0;
  110. for(k=1;k<=4;k++)
  111. {
  112. b[i][j]=(b[i][j]+(jz[i][k]*jz[k][j])%mo)%mo;
  113. }
  114. }
  115. for(i=1;i<=4;i++)
  116. for(j=1;j<=4;j++)
  117. {
  118. jz[i][j]=b[i][j];
  119. }
  120. nn/=2;
  121. }
  122. return y;
  123. }
  124. int main()
  125. {
  126. scanf("%d%d%d",&n,&m,&mo);
  127. scanf("%s",t+1);
  128. s[1]='0';
  129. s1[1]='1';
  130. long long i,j,k,l,x,y;
  131. for(j=1;j<=n;j++)
  132. {
  133. for(i=1;i<=lens1;i++)
  134. s2[i]=s1[i];
  135. for(i=1;i<=lens;i++)
  136. s1[i]=s[i];
  137. for(i=1;i<=lens1;i++)
  138. {
  139. s1[lens+i]=s2[i];
  140. }
  141. for(i=1;i<=lens1;i++)
  142. s[i]=s2[i];
  143. x=lens1;
  144. lens1+=lens;
  145. lens=x;
  146. y=j;
  147. if(lens>=m)
  148. break;
  149. }
  150. kmp();
  151. if(n==y)
  152. {
  153. printf("%d\n",f[0][1]%mo);
  154. return 0;
  155. }
  156. kmp1();
  157. f[1][1]=(f[0][2])%mo;
  158. f[1][2]=(f[0][1]+f[0][2]+f[0][0])%mo;
  159. f[1][3]=(f[0][3])%mo;
  160. f[1][4]=(f[0][4])%mo;
  161. n-=y+1;
  162. x=1;
  163. y=0;
  164. y=f[1][3];
  165. n-=0;
  166. nnn=n%2;
  167. nn=n/2;
  168. x=mi();
  169. if(nnn==1)
  170. {
  171. printf("%d\n",(f[x][2])%mo);
  172. return 0;
  173. }
  174. else
  175. printf("%d\n",f[x][1]%mo);
  176. }

【GDOI2016模拟3.9】暴走的图灵机的更多相关文章

  1. 【GDOI2016模拟3.15】基因合成(回文串+性质+DP)

    [GDOI2016模拟3.15]基因合成 题意: 给一个目标串,要求从空串进行最少的操作次数变成目标串,操作有两种: 在串的头或尾加入一个字符. 把串复制一遍后反向接到串的末尾. 因为有回文操作,所以 ...

  2. 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)

    [GDOI2016模拟3.16]幂 \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数. \(A,B\)都是\(10^9\)级别. 然后我们开搞. 首先,假设一个合法的\ ...

  3. 【GDOI2016模拟4.22】总结

    前言 早上,一进机房,发现所有人神情严肃,一股(\(da\))(\(ba\))场的气氛迎面扑来,我一下子意识到:nothing good! 这场比赛结果不是很好,50分: 第一题:感觉上是个神奇的匹配 ...

  4. 【GDOI2016模拟3.10】习用之语

    前言 这道题看上去很水,结果我在比赛上浪费了N多时间在上面,但还是没AC.比赛结束后发现:实际上这道题还是是大水. 题目 分析 设字符串c1c2c3c4,其中c1.c2.c3.c4={'0'~'9', ...

  5. 【JZOJ4461】【GDOI2016模拟4.21】灯塔 分治

    题面 GDOI是一个地处丘陵的小国,为了边防建设,国王希望在国界线上的某一座山峰上建立一座灯塔,照亮整个边界.而灯塔建设的调研工作,就交给了你. GDOI的国境线上有N座连续的山峰,其中第i座的高度是 ...

  6. AI数学基础之:确定图灵机和非确定图灵机

    目录 简介 图灵机 图灵机的缺点 等效图灵机 确定图灵机 非确定图灵机 简介 图灵机是由艾伦·麦席森·图灵在1936年描述的一种抽象机器,它是人们使用纸笔进行数学运算的过程的抽象,它肯定了计算机实现的 ...

  7. 操作系统之CPU管理的直观想法

    计算机:是工具,帮助解决实际问题 操作系统,是为了方便使用硬件 计算机模型: 图灵机,模拟人类计算 起初的图灵机就像一个只会做一道菜的厨师 通用图灵机,核心是设置控制器动作(修改控制器),把逻辑读入控 ...

  8. p,np,npc,np难问题,确定图灵机与非确定图灵机

    本文转自豆瓣_燃烧的影子 图灵机与可计算性 图灵(1912~1954)出生于英国伦敦,19岁进入剑桥皇家学院研究量子力学和数理逻辑.1935年,图灵写出了"论高斯误差函数"的论文, ...

  9. 图灵机(转自wiki)

    图灵机(英语:Turing machine),又称确定型图灵机,是英国数学家艾伦·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻 ...

随机推荐

  1. jest 事件测试

    概述 最近玩 Jest,测试 Vue 组件上的事件,有一些心得,记录下来供以后开发时参考,相信对其他人也有用. 事件测试 对于 Vue 组件上的事件,分为 2 种,一种是子组件 Emit 的事件,另一 ...

  2. REST API (四)之Generic views

    通用的视图 Django’s generic views... were developed as a shortcut for common usage patterns... 它们采取一些常见的习 ...

  3. 动画演示 Delphi 2007 IDE 功能[2] - 定义变量

    https://my.oschina.net/hermer/blog/319152 动画剧本: 第一个变量: 输入: var; 然后执行 Ctrl+J ... 回车 第二个变量: 执行 Ctrl+J; ...

  4. SpringCloud:(一)服务注册与发现

    最近跟着方志明老师学习SpringCloud,博客地址如下: https://blog.csdn.net/forezp/article/details/81040925 自己也跟着撸了一遍,纸上得来终 ...

  5. Python2.7安装&配置环境变量

    python安装版本为2.7 下载安装包,双击安装,一路按照提示进行. 安装完成后,配置环境变量. 我的电脑—属性--高级系统设置—高级—环境变量--Path--编辑(将安装路径粘贴进去),添加到安装 ...

  6. Github 上 Star 最多的个人 Spring Boot 开源学习项目(三)

    网上连载了 Spring Boot 系列文章 这个开源项目就是 spring-boot-examples ,这是一个专注帮助初学者学习 Spring Boot 的开源项目,里面分享了各种场景下 Spr ...

  7. SpringMVC访问映射的jsp文件时,报404错误

    配置文件中需要配置映射自然不必多说 <bean class="org.springframework.web.servlet.view.InternalResourceViewReso ...

  8. 【Linux 环境搭建】Ubuntu下安装tftp

    1.安装软件    sudo apt-get install tftp-hpa tftpd-hap xinetd 2.修改配置文件    sudo vim /etc/default/tftpd-hpa ...

  9. QQ管理

    ##用例1:查询数据 #01.查询QQ号码为54789625的所有好友信息,包括QQ号码,昵称,年龄 # # SELECT `relation`.RelationQQID AS QQ号码,`basei ...

  10. P1507NASA食物

    这道题是一个01背包的延伸题,只要透彻理解了,就不难了. 这个题有两个T,一个是体积一个是质量,所以这时候我们必须要加一个for了,同时要优化空间(三维降二维),然后用f[j][k]来表示当体积为j, ...