[cf461E]Appleman and a Game
考虑我的每一次添加操作,要满足: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的更多相关文章
- 【CF461E】Appleman and a Game 倍增floyd
[CF461E]Appleman and a Game 题意:你有一个字符串t(由A,B,C,D组成),你还需要构造一个长度为n的字符串s.你的对手需要用t的子串来拼出s,具体来说就是每次找一个t的子 ...
- 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 ...
- Codeforces 461B. Appleman and Tree[树形DP 方案数]
B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- CF461B Appleman and Tree (树DP)
CF462D Codeforces Round #263 (Div. 2) D Codeforces Round #263 (Div. 1) B B. Appleman and Tree time l ...
- 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 ...
- 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 ...
- 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 ...
- CodeForces 462B Appleman and Card Game(贪心)
题目链接:http://codeforces.com/problemset/problem/462/B Appleman has n cards. Each card has an uppercase ...
- Codeforces 461B Appleman and Tree(木dp)
题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...
随机推荐
- CentOS 7.9+19c单实例静默安装
一.环境准备 二.解压文件 三.文件配置 四.安装 五.相关调整 六.打补丁 一.环境准备0.依赖包安装 rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE} (%{A ...
- mysql中一半会选择什么样的字段为索引?(含索引创建删除查看公式)
一.数据量庞大的数据做索引 二.该字段经常出现在where的后面,以条件形式存在,经常被用户搜索的字段 三.很少被增删改的字段,因为增删改后,索引会重新排序 索引的创建 create index 索引 ...
- res目录下的结构
目录 res目录下的结构 drawable开头的文件夹 mipmap开头的文件夹 values开头的文件夹 layout文件夹 使用res目录下的资源 res目录下的结构 如果你展开res目录看一下, ...
- Hadoop面试题(四)——YARN
1.简述hadoop1与hadoop2 的架构异同 1)加入了yarn解决了资源调度的问题. 2)加入了对zookeeper的支持实现比较可靠的高可用. 2.为什么会产生 yarn,它解决了什么问题, ...
- Java正则中"\\\\"表示普通反斜杠
Java中"\"用于转义字符,"\\"表示普通无转义功能的反斜杠. 如果将字符串当做正则表达式来解析,那么"\\"也有了特殊意义,它与其后的 ...
- Convolutional Neural Network-week2编程题1(Keras tutorial - 笑脸识别)
本次我们将: 学习到一个高级的神经网络的框架,能够运行在包括TensorFlow和CNTK的几个较低级别的框架之上的框架. 看看如何在几个小时内建立一个深入的学习算法. 为什么我们要使用Keras框架 ...
- AIApe问答机器人Scrum Meeting 4.29
Scrum Meeting 4 日期:2021年4月29日 会议主要内容概述:汇报两日工作,讨论任务优先级. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 李明 ...
- luogu P4243 [JSOI2009]等差数列 题解
前言: 这题真ex... 强烈谴责在题解里面放毒瘤题链接的屑出题人! 吐 ️ 解析: 这题分成两步走. 首先,既然题目中的修改操作是区间加等差数列,那么就容易想到在差分数组上进行操作. 然后就是相当恶 ...
- 洛谷 P5657 [CSP-S2019] 格雷码
链接: P5657 分析: 签到题,不过也有不少细节. 数据范围需要开 unsigned long long ,前年也有很多人因此丢了5分. pow 会出现神必错误,需要手写一个 mpow 函数. 算 ...
- 第K个数 牛客网 程序员面试金典 C++ Python
第K个数 牛客网 程序员面试金典 C++ Python 题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测 ...