题目

分析

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

a0=a1

a1=a0+a1+C

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

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

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

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

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

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
using namespace std;
char s[30000],s1[30000],s2[30000],t[30000];
long long n,m,tot,ans,mo,next[30000],f[2][5],lens=1,lens1=1,nn,nnn;
long long jz[5][5]=
{
{0,0,0,0,0},
{0,1,1,0,0},
{0,1,2,0,0},
{0,1,1,1,0},
{0,0,1,0,1}
},b[5][5];
long long getnext()
{
long long i,j,k;
j=0;
for(i=2;i<=m;i++)
{
while(j>0 && t[j+1]!=t[i]) j=next[j];
if(t[j+1]==t[i]) j++;
next[i]=j;
}
}
long long kmp()
{
long long i,j,k;
getnext();
j=0;
for(i=1;i<=lens;i++)
{
while(j>0 && t[j+1]!=s[i]) j=next[j];
if(t[j+1]==s[i]) j++;
if(j==m) f[0][1]++;
}
j=0;
for(i=1;i<=lens1;i++)
{
while(j>0 && t[j+1]!=s1[i]) j=next[j];
if(t[j+1]==s1[i]) j++;
if(j==m) f[0][2]++;
}
}
long long kmp1()
{
long long i,j,k;
k=0;
for(i=lens-m+2;i<=lens;i++)
s2[++k]=s[i];
for(i=1;i<=m-1;i++)
s2[++k]=s1[i];
j=0;
for(i=1;i<=m+m-2;i++)
{
while(j>0 && t[j+1]!=s2[i]) j=next[j];
if(t[j+1]==s2[i]) j++;
if(j==m) f[0][0]++;
}
k=0;
for(i=lens1-m+2;i<=lens1;i++)
s2[++k]=s1[i];
for(i=1;i<=m-1;i++)
s2[++k]=s[i];
j=0;
for(i=1;i<=m+m-2;i++)
{
while(j>0 && t[j+1]!=s2[i]) j=next[j];
if(t[j+1]==s2[i]) j++;
if(j==m) f[0][3]++;
}
k=0;
for(i=lens1-m+2;i<=lens1;i++)
s2[++k]=s1[i];
for(i=1;i<=m-1;i++)
s2[++k]=s1[i];
j=0;
for(i=1;i<=m+m-2;i++)
{
while(j>0 && t[j+1]!=s2[i]) j=next[j];
if(t[j+1]==s2[i]) j++;
if(j==m) f[0][4]++;
}
}
long long mi()
{
long long x=0,y=1,i,j,k;
while(nn>0)
{
if(nn&1==1)
{
for(i=1;i<=4;i++)
{
f[x][i]=0;
for(j=1;j<=4;j++)
f[x][i]=(f[x][i]+(f[y][j]*jz[j][i])%mo)%mo;
}
x=y;
y=1-y;
}
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
{
b[i][j]=0;
for(k=1;k<=4;k++)
{
b[i][j]=(b[i][j]+(jz[i][k]*jz[k][j])%mo)%mo;
}
}
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
{
jz[i][j]=b[i][j];
}
nn/=2;
}
return y;
}
int main()
{
scanf("%d%d%d",&n,&m,&mo);
scanf("%s",t+1);
s[1]='0';
s1[1]='1';
long long i,j,k,l,x,y;
for(j=1;j<=n;j++)
{
for(i=1;i<=lens1;i++)
s2[i]=s1[i];
for(i=1;i<=lens;i++)
s1[i]=s[i];
for(i=1;i<=lens1;i++)
{
s1[lens+i]=s2[i];
}
for(i=1;i<=lens1;i++)
s[i]=s2[i];
x=lens1;
lens1+=lens;
lens=x;
y=j;
if(lens>=m)
break;
}
kmp();
if(n==y)
{
printf("%d\n",f[0][1]%mo);
return 0;
}
kmp1();
f[1][1]=(f[0][2])%mo;
f[1][2]=(f[0][1]+f[0][2]+f[0][0])%mo;
f[1][3]=(f[0][3])%mo;
f[1][4]=(f[0][4])%mo;
n-=y+1;
x=1;
y=0;
y=f[1][3];
n-=0;
nnn=n%2;
nn=n/2;
x=mi();
if(nnn==1)
{
printf("%d\n",(f[x][2])%mo);
return 0;
}
else
printf("%d\n",f[x][1]%mo);
}

【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. nacos 发布配置

    server 保留 2 份配置文件,一份在 mysql,一份在本地磁盘,同时在内存中缓存配置文件的 md5 值.当客户端获取配置时,server 直接返回本地磁盘文件,使用的是 sendFile ap ...

  2. 四:flask-URL两种传参方式(路径传参和get传参)

    新建一个视图 第一种:路径传参:url/参数:<参数名>,然后再视图函数中接收参数 也可以指定数据类型 string:默认使用此数据类型,接收没有任何斜杠"\/"的文本 ...

  3. postman杂记

    接到测试任务,测试6个接口 rap2 上的接口比较多,整体导出内容太多 就一个接口一个接口的,复制到了postman上 rap2部分接口,开发没有备注简介内容:通知开发备注下 对接口的理解,还是靠功能 ...

  4. Simplify Path(路径简化)

    问题: 来源:https://leetcode.com/problems/simplify-path Given an absolute path for a file (Unix-style), s ...

  5. SpringBoot 使用 RestTemplate 调用exchange方法 显示错误信息

    SpringBoot使用RestTempate SpringBoot使用RestTemplate摘要认证 SpringBoot使用RestTemplate基础认证 SpringBoot使用RestTe ...

  6. 【Linux内核】编译与配置内核(arm)

    ARM平台使用的内核 (1)清除原有的配置与中间文件 make distclean(2)配置内核 make menuconfig ARCH=arm(3)编译内核 make uImage ARCH=ar ...

  7. Hive调优参数配置

    Hive进行大数据处理的过程中经常遇到一个任务跑几个小时或者内存溢出等问题,平时会任务执行的遇到的问题 进行参数的调整配置,收集整理的配置参考如下: set dfs.namenode.handler. ...

  8. 如何在ubuntu上安装 搜狗输入法(已经成功)

    转自:https://blog.csdn.net/qq_37589838/article/details/81208409 本文链接:https://blog.csdn.net/qq_37589838 ...

  9. [多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)

    [多校联考2019(Round 5)]青青草原的表彰大会(dp+组合数学) 题面 青青草原上有n 只羊,他们聚集在包包大人的家里,举办一年一度的表彰大会,在这次的表彰大会中,包包大人让羊们按自己的贡献 ...

  10. chrome浏览器截长图的方法

    1.首先打开一个你想要截图的长页面 2.然后按下F12 3.按Ctrl+Shift+P打开console菜单 4.在有个红对勾的位置输入Capture full size screenshot,找到C ...