【CF461E】Appleman and a Game 倍增floyd
【CF461E】Appleman and a Game
题意:你有一个字符串t(由A,B,C,D组成),你还需要构造一个长度为n的字符串s。你的对手需要用t的子串来拼出s,具体来说就是每次找一个t的子串放在已经拼出来的串的后面。你想要最大化你的对手拼出s的所需次数,你的对手是绝顶聪明的。输出这个次数。
$n\le 10^{18},|t|\le 10^5$
题解:先从对手的角度考虑,每次它肯定是尽可能的延伸已有的字符串,一直延伸到t中不存在这个子串为止。所以我们可以每次向s中加入[a,b),使得t中不存在[a,b]。我们可以把问题转换成:如果想让对手至少拼i次,我们需要的s最短可以是多少。到时候二分这个答案即可。
设f[i][a][b]表示让对手至少拼i次,且s从字符a还开始,下一个字符是b时,s的最短长度。那么我们可以找出最小的l,满足t中不包含所有从a开始以b结束的子串。因为长度为l的串有$4^{l-2}$种(去掉a,b),而t中长度为l的串只有$|t|-l$个,所以l只需要枚举到$\log t$即可,具体过程可以用Trie树来搞。所以f[i][a][b]=l-1。
接着上倍增floyd即可。
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- const int maxn=100010;
- ll n,ans;
- int m,tot;
- char str[maxn];
- int ch[maxn*20][4],cnt[4][4][22];
- struct M
- {
- ll v[4][4];
- M () {memset(v,0x3f,sizeof(v));}
- ll * operator [] (const int &a) {return v[a];}
- M operator * (const M &a) const
- {
- M b;
- int i,j,k;
- for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) b.v[i][j]=min(b.v[i][j],v[i][k]+a.v[k][j]);
- return b;
- }
- inline bool check()
- {
- int i,j;
- for(i=0;i<4;i++) for(j=0;j<4;j++) if(v[i][j]<n) return 1;
- return 0;
- }
- }f[64],g,h;
- int main()
- {
- scanf("%lld%s",&n,str),m=strlen(str);
- int i,j,u,a,b,mx;
- tot=1;
- for(i=0;i<m;i++)
- {
- a=str[i]-'A';
- for(u=1,j=i;j<m&&j<i+20;j++)
- {
- b=str[j]-'A';
- if(!ch[u][b]) ch[u][b]=++tot,cnt[a][b][j-i]++;
- u=ch[u][b];
- }
- }
- for(a=0;a<4;a++) for(b=0;b<4;b++)
- {
- for(j=1;cnt[a][b][j]==(1<<((j-1)<<1));j++);
- f[0][a][b]=j;
- }
- memset(g.v,0,sizeof(g.v));
- //if(n>=100) for(a=0;a<4;a++) for(b=0;b<4;b++) printf("%d %d:%lld\n",a,b,f[0][a][b]);
- for(mx=0;f[mx].check();mx++) f[mx+1]=f[mx]*f[mx];
- for(i=mx-1;i>=0;i--)
- {
- h=g*f[i];
- if(h.check()) g=h,ans|=1ll<<i;
- }
- printf("%lld",ans+1);
- return 0;
- }//260048835025948762 AAAABAACAADA
【CF461E】Appleman and a Game 倍增floyd的更多相关文章
- 2018.11.09 bzoj4773: 负环(倍增+floyd)
传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...
- 2018.11.09 bzoj1706: relays 奶牛接力跑(倍增+floyd)
传送门 倍增+floyd板子题. 先列出状态fi,j,kf_{i,j,k}fi,j,k表示经过iii条边从jjj到kkk的最短路. 然后发现可以用fi−1,j,kf_{i-1,j,k}fi−1,j, ...
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
- BZOJ4773: 负环(倍增Floyd)
题意 题目链接 Sol 倍增Floyd,妙妙喵 一个很显然的思路(然而我想不到是用\(f[k][i][j]\)表示从\(i\)号点出发,走\(k\)步到\(j\)的最小值 但是这样复杂度是\(O(n^ ...
- bzoj2165: 大楼(倍增floyd)
题目大意:一个有向图,n(<=100)个点求一条长度>=m(<=10^18)的路径最少经过几条边. 一开始以为是矩乘,蓝鹅当时还没开始写,所以好像给CYC安利错了嘿嘿嘿QWQ 第一眼 ...
- 【BZOJ4773】负环 倍增Floyd
[BZOJ4773]负环 Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边 ...
- 【bzoj2306】[Ctsc2011]幸福路径 倍增Floyd
题目描述 一张n个点的有向图,每个点有一个权值.一开始从点$v_0$出发沿图中的边任意移动,移动到路径上的第$i$个点 输入 每一行中两个数之间用一个空格隔开. 输入文件第一行包含两个正整数 n, ...
- 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd
题目描述 FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100) ...
- 【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd
题目描述 Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最 ...
随机推荐
- 转 ef中使用mysql步骤--Entity Framework 6 with MySql
原文:http://lvasquez.github.io/2014/11/18/EntityFramework-MySql/ For the Entity Framework 6 support we ...
- JAVA自学笔记23
JAVA自学笔记23 1.多线程 1)引入: 2)进程 是正在运行的程序.是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 多进程: 单进程的计算机只能做一件事情,而现在 ...
- CSS 埋点统计
原文地址: https://my.oschina.net/u/1778933/blog/1608904 CSS 埋点统计 当一个网站或者 App 的规模达到一定程度,需要分析用户在 App 或者网站的 ...
- linux 系统下使用socket进行本地进程间通信
转自:https://blog.csdn.net/baidu_24553027/article/details/54912724 使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不 ...
- CSS魔法堂:稍稍深入伪类选择器
前言 过去零零星星地了解和使用:link.::after和content等伪类.伪元素选择器,最近看书时发现这方面有所欠缺,于是决定稍微深入学习一下,以下为伪类部分的整理. 伪类 伪类选择器实质上 ...
- kettle 6.1 按时间增量抽取数据
1.设计一个增量 配置表ETL_INCREMENTAL,用于配置表的增量时间等数据 2.增量JOB全图如下: 2.1获取增量时间变量,并设置增量变量 2.2 表的增量转换,在表中引用2.1的增量变量 ...
- C# Monitor实现
Monitor的code如下,非常简单: public static class Monitor { public static extern void Enter(Object obj); publ ...
- bootstrap-3-验证表单
js: $('#nqs-add-userxinxi-form').bootstrapValidator({ message: 'This value is not valid', excluded : ...
- 一步步教你轻松学KNN模型算法
一步步教你轻松学KNN模型算法( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解. ...
- 优麒麟 16.04 LTS(长期支持)版本
Ubuntu Kylin (中文又被称为优麒麟)是基于Ubuntu的一款官方衍生版. 它是一款专门为中国市场打造的免费操作系统.它包括Ubuntu用户期待的各种功能,并配有必备的中文软件及程序. ht ...