考虑我的每一次添加操作,要满足:1.该串是t的子串;2.该串不能与下一次的串开头字母构成t的子串。那么,设f[i][j][k]表示拼i次,第i次填入的开头字母是j,第i+1填入的开头字母是k的最短长度。

状态转移方程:f[i][j][k]=min(f[i-1][j][t]+f[1][t][k]),这个东西可以用矩阵乘法来搞(把加改成min即可)。

这样求出的最后一个存在j和k满足f[i][j][k]<n的i即为答案,因为f[i][j][k]的值一定随i的增长而增长,因此可以二分i并判断是否存在。

之后还要预处理出f[1][i][j],这个东西暴力枚举显然是$o(n^{2})$的,但是发现判断f[1][i][j]不合法当且仅当所有以i为开头以j为结尾且长度为f[1][i][j]的串都是t的子串,而t中长度固定的串不超过|t|个,而这样的串有$4^{f[1][i][j]}$个,如果满足$4^{f[1][i][j]}>|t|$则f[1][i][j]一定不合法,大约有$f[1][i][j]\leq 20$。

接下来计算就很简单来,可以对s中所有长度小于等于20的子串建一棵trie树并统计一下就可以。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 struct ji{
5 ll a[5][5];
6 }a,b,c;
7 ll n,k;
8 int V,tr[2000005][5],f[5][5][100005];
9 char s[100005];
10 void ins(int k){
11 for(int i=k,j=1;(i<k+20)&&(s[i]);j=tr[j][s[i++]-'A'])
12 if (!tr[j][s[i]-'A']){
13 tr[j][s[i]-'A']=++V;
14 f[s[k]-'A'][s[i]-'A'][i-k]++;
15 }
16 }
17 ji cheng(ji a,ji b){
18 for(int i=0;i<4;i++)
19 for(int j=0;j<4;j++)c.a[i][j]=n+1;
20 for(int i=0;i<4;i++)
21 for(int j=0;j<4;j++)
22 for(int k=0;k<4;k++)
23 c.a[i][k]=min(c.a[i][k],a.a[i][j]+b.a[j][k]);
24 return c;
25 }
26 void ksm(ji a,ll n){
27 while (n){
28 if (n&1)b=cheng(b,a);
29 a=cheng(a,a);
30 n/=2;
31 }
32 }
33 bool pd(ji a){
34 for(int i=0;i<4;i++)
35 for(int j=0;j<4;j++)
36 if (a.a[i][j]<n)return 1;
37 return 0;
38 }
39 int main(){
40 scanf("%lld%s",&n,s);
41 V=1;
42 for(int i=0;s[i];i++)ins(i);
43 for(int i=0;i<4;i++)
44 for(int j=0;j<4;j++){
45 for(int k=1;f[i][j][k]==(1<<(2*k-2));k++)a.a[i][j]=k;
46 a.a[i][j]++;
47 }
48 k=n;
49 for(ll i=0;i<k;){
50 memset(b.a,0,sizeof(b.a));
51 ll j=(i+k+1>>1);
52 ksm(a,j);
53 if (pd(b))i=j;
54 else k=j-1;
55 }
56 printf("%lld",k+1);
57 }

[cf461E]Appleman and a Game的更多相关文章

  1. 【CF461E】Appleman and a Game 倍增floyd

    [CF461E]Appleman and a Game 题意:你有一个字符串t(由A,B,C,D组成),你还需要构造一个长度为n的字符串s.你的对手需要用t的子串来拼出s,具体来说就是每次找一个t的子 ...

  2. CodeForces462 A. Appleman and Easy Task

    A. Appleman and Easy Task time limit per test 1 second memory limit per test 256 megabytes input sta ...

  3. Codeforces 461B. Appleman and Tree[树形DP 方案数]

    B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  4. CF461B Appleman and Tree (树DP)

    CF462D Codeforces Round #263 (Div. 2) D Codeforces Round #263 (Div. 1) B B. Appleman and Tree time l ...

  5. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  6. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)

    题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...

  7. Codeforces Round #263 (Div. 1) C. Appleman and a Sheet of Paper 树状数组暴力更新

    C. Appleman and a Sheet of Paper   Appleman has a very big sheet of paper. This sheet has a form of ...

  8. CodeForces 462B Appleman and Card Game(贪心)

    题目链接:http://codeforces.com/problemset/problem/462/B Appleman has n cards. Each card has an uppercase ...

  9. Codeforces 461B Appleman and Tree(木dp)

    题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...

随机推荐

  1. 高中最后一刻&大学第一课&为人师的责任

    文章不是技术文,只是分享一些感想,作为一只程序猿,不说好好敲代码,跑出来思考人生,不是合格的程序猿,罪过罪过,自我反思3秒钟,我们继续,毕竟程序猿的人生不只是Coding,也希望自己这点感想被更多刚入 ...

  2. bzoj1972 SDOI2010-----猪国杀(模拟)

    题目自己去找吧 记得数据范围是<=10 注意事项: 1.牌库空的时候,要不断的抽第一张牌 2.反贼的决斗永远是向主公发的 3.每次判定无懈的时候,都是从使用锦囊的那个牌开始,记得敌意和殷勤的判断 ...

  3. WIFI Deauth攻击-爬坑笔记

    这里用Aircrack这款工具进行介绍: 准备工作:无线网卡连接电脑或者虚拟机(免驱的最好),如需驱动请自行安装驱动 1.将无线网卡接入测试电脑Linux虚拟机(装有Aircrack-ng) 2.测试 ...

  4. CentOS 压缩解压

    目录 命令 tar gzip.gunzip bzip2.bunzip2 zip.unzip 命令组合 打包:将多个文件合成一个总的文件,这个总的文件通常称为"归档". 压缩:将一个 ...

  5. Shadertoy 教程 Part 1 - 介绍

    Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...

  6. [Git系列] 前言

    Git 简介 Git 是一个重视速度的分布式版本控制和代码管理系统,最初是由 Linus Torvalds 为开发 Linux 内核而设计并开发的,是一款遵循二代 GUN 协议的免费软件.这一教程会向 ...

  7. 2021.7.29考试总结[NOIP模拟27]

    T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...

  8. 2021.1.8 NKOJ 周赛总结

    意料之中..... A:nkoj 3900 AC小程序 http://oi.nks.edu.cn/zh/Problem/Details/3900 A题比较简单,单独分析一下A和C,其实就是一个斐波那契 ...

  9. 『学了就忘』Linux基础 — 10、VMware虚拟机中克隆的使用

    目录 1.什么是克隆 2.克隆的两种类型 (1)完整克隆 (2)链接克隆 3.克隆操作 步骤一:克隆虚拟机 步骤二:进行克隆导向 3.快照与克隆的区别 4.镜像的管理 快照和克隆是VMware中两个非 ...

  10. .NET 生态系统的蜕变之 .NET 6

    .NET 6 是自.NET 4 框架以来生态系统看到的最大版本更新,虽然.NET Core 是2014年开始非常大的一项重大战略举措,但是.NET 6是真正的具有强大动力的非常重要的版本. 2021年 ...