【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的更多相关文章

  1. 2018.11.09 bzoj4773: 负环(倍增+floyd)

    传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...

  2. 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, ...

  3. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

  4. BZOJ4773: 负环(倍增Floyd)

    题意 题目链接 Sol 倍增Floyd,妙妙喵 一个很显然的思路(然而我想不到是用\(f[k][i][j]\)表示从\(i\)号点出发,走\(k\)步到\(j\)的最小值 但是这样复杂度是\(O(n^ ...

  5. bzoj2165: 大楼(倍增floyd)

    题目大意:一个有向图,n(<=100)个点求一条长度>=m(<=10^18)的路径最少经过几条边. 一开始以为是矩乘,蓝鹅当时还没开始写,所以好像给CYC安利错了嘿嘿嘿QWQ 第一眼 ...

  6. 【BZOJ4773】负环 倍增Floyd

    [BZOJ4773]负环 Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边 ...

  7. 【bzoj2306】[Ctsc2011]幸福路径 倍增Floyd

    题目描述 一张n个点的有向图,每个点有一个权值.一开始从点$v_0$出发沿图中的边任意移动,移动到路径上的第$i$个点 输入 每一行中两个数之间用一个空格隔开. 输入文件第一行包含两个正整数 n,  ...

  8. 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd

    题目描述 FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100) ...

  9. 【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd

    题目描述 Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最 ...

随机推荐

  1. sench touch 自定义小图标(转)

    自定义图标的方法 Sencha touch自带图标有限,有时需要自己添加图标.下面介绍自定义图标的方法: 首先需要生成图标字体.有许多网站提供在线生成图标字体的功能,比如IcoMoon,通过这个网站, ...

  2. 3、css初识

    前端内容就分三部分html.css.javascript(js),对一个网页来说html相当于是一个裸体的人,css相当于给这个人穿上了衣服,javascript相当于给这个人赋予动作行为,今天我们要 ...

  3. mybatis foreach中collection的三种用法

    原文:https://www.cnblogs.com/xiemingjun/p/9800999.html foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach ...

  4. 用DirectX实现多视图渲染

    什么是多视图 一般的3D程序都只有一个视图,对应整个窗口的客户区.多视图就是在一个窗口中放置多个视图,以便从不同的角度观察模型或者场景.很多图形软件都有这个功能,比如大家熟知的3DMax就有四个视图, ...

  5. CentOS 7最小安装之后应该尽快做好的几件事情

    1        导言 CentOS的最小系统仅包含内核和必要的工具,派不上多大用处,以后还得安装很多附加软件.为了方便以后的工作,还需要对系统做一些调整和补充. 本文涉及的工作均应以root身份执行 ...

  6. 提升SQLite数据插入效率低、速度慢的方法(转)

    前言 SQLite数据库由于其简单.灵活.轻量.开源,已经被越来越多的被应用到中小型应用中.甚至有人说,SQLite完全可以用来取代C语言中的文件读写操作.因此我最近编写有关遥感数据处理的程序的时候, ...

  7. Swagger Annotation 详解(建议收藏)

    转载:https://www.jianshu.com/p/b0b19368e4a8 在软件开发行业,管理文档是件头疼的事.不是文档难于撰写,而是文档难于维护,因为需求与代码会经常变动,尤其在采用敏捷软 ...

  8. 【JavaScript从入门到精通】第一课 初探JavaScript魅力-01

    第一课 初探JavaScript魅力-01 JavaScript是什么 如今我们打开一个大型的网站,都会有很多JS效果的功能和应用.对于学过CSS+HTML的同学,即使是像淘宝那样的网站,用一两天时间 ...

  9. Oracle 之 树查询 START WITH ... CONNECT BY ...子句

    START WITH ... CONNECT BY ...子句是结构化查询中用到的,其基本语法是: select … from tablename start with 条件1 connect by ...

  10. intellj idea 跑覆盖率