[BZOJ4180] 字符串计数
膜一发KsCla巨佬
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
struct __SAM {
int lst,tot,ch[N][4],prt[N],mxl[N];
void init() {
memset(ch[1],0,sizeof ch[1]);
lst=tot=1;
}
void extend(int c) {
int p=lst,x=lst=++tot; mxl[x]=mxl[p]+1;
while(p&&!ch[p][c]) ch[p][c]=x,p=prt[p];
if(!p) prt[x]=1;
else {
int q=ch[p][c];
if(mxl[q]==mxl[p]+1) prt[x]=q;
else {
int k=++tot;
mxl[k]=mxl[p]+1; prt[k]=prt[q];
prt[q]=prt[x]=k;
memcpy(ch[k],ch[q],sizeof ch[q]);
while(ch[p][c]==q) ch[p][c]=k,p=prt[p];
}
}
}
} SAM;
ll n;
char str[N]; queue<int> Q;
int m,dep[N]; bool vis[N];
struct Mtrx {
ll a[4][4];
ll*operator[](const int&x) {return a[x];}
const ll*operator[](const int&x) const{return a[x];}
ll getMin() {
ll ans=2e18;
for(int i=0; i<m; ++i) ans=*min_element(a[i],a[i]+m);
return ans;
}
Mtrx getPow(ll y) {
if(y==1) return *this;
Mtrx c=*this,x=c; y--;
for(; y; y>>=1,x=x*x) if(y&1) c=c*x;
return c;
}
Mtrx operator*(const Mtrx&b) const{
Mtrx c; memset(&c,0x3f,sizeof c);
for(int i=0; i<m; ++i) for(int k=0; k<m; ++k)
for(int j=0; j<m; ++j) c[i][j]=min(c[i][j],a[i][k]+b[k][j]);
return c;
}
} E;
inline void bfs(int T) {
memset(vis,0,sizeof vis);
dep[SAM.ch[1][T]]=1;
vis[SAM.ch[1][T]]=1;
Q.push(SAM.ch[1][T]);
while(Q.size()) {
int x=Q.front(); Q.pop();
for(int i=0,y; i<m&&(y=SAM.ch[x][i],true); ++i)
if(y&&!vis[y]) Q.push(y),vis[y]=1,dep[y]=dep[x]+1;
else E[T][i]=min(E[T][i],(ll)dep[x]);
}
}
int main() {
SAM.init();
scanf("%lld%s",&n,str);
for(int i=0; str[i]; ++i) {
SAM.extend(str[i]-'A');
m=max(m,str[i]-'A'+1);
}
memset(&E,0x3f,sizeof E);
for(int i=0; i<m; ++i) bfs(i);
ll l=0,r=1e18,mid,ans=0;
while(l<=r) {
mid=(l+r)>>1;
if(E.getPow(mid).getMin()<n) l=mid+1;
else ans=mid,r=mid-1;
}
printf("%lld\n",ans);
return 0;
}
[BZOJ4180] 字符串计数的更多相关文章
- BZOJ4180:字符串计数(SAM,二分,矩阵乘法)
Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', ...
- 【BZOJ-4180】字符串计数 后缀自动机 + 矩阵乘法
4180: 字符串计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 146 Solved: 66[Submit][Status][Discuss] ...
- 【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)
4180: 字符串计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 164 Solved: 75 Description SD有一名神犇叫做Oxe ...
- bzoj 4180: 字符串计数
Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', ...
- Codeword CodeForces - 666C (字符串计数)
链接 大意:求只含小写字母, 长度为n, 且可以与给定模板串匹配的字符串个数 (多组数据) 记模板串为P, 长为x, 总串为S. 设$f_i$为S为i时的匹配数, 考虑P最后一位的首次匹配位置. 若为 ...
- 「bzoj 4180: 字符串计数」
题目 真是一道好题 首先根据一个非常显然的贪心,如果给出了一个串\(S\),我们如何算最小操作次数呢 非常简单,我们直接把\(S\)拉到\(T\)的\(SAM\)上去跑,如果跑不动了就停下来,重新回到 ...
- Codeforces Beta Round #17 C. Balance (字符串计数 dp)
C. Balance time limit per test 3 seconds memory limit per test 128 megabytes input standard input ou ...
- BZOJ 4180: 字符串计数 后缀自动机 + 矩阵乘法 + 二分(神题)
Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C ...
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
随机推荐
- zabbix自动注册,实现自动添加机器,减少人工干预
1.zabbix_agent的安装配置: vim install_zabbix_agent.sh #!/bin/bash #author:chenjianwen RealIP=`curl -s htt ...
- C++入门经典-例8.3-子类显示调用父类构造函数
1:当父类含有带参数的构造函数时,创建子类的时候会调用它吗?答案是通过显示方式才可以调用. 无论创建子类对象时调用的是那种子类构造函数,都会自动调用父类默认构造函数.若想使用父类带参数的构造函数,则需 ...
- Windows Server 2012R2 / 2008R2 修改密码策略(password policy)
一. 针对于未添加到域中的机器 cmd中执行gpedit.msc 打开Local Group Policy Editor查看password policy设置,修改对应的password polic ...
- 黑马lavarel教程---12、lavarel验证码
黑马lavarel教程---12.lavarel验证码 一.总结 一句话总结: 用插件的时候仔细看插件的版本要求 1.lavarel安装验证码插件的时候,如果(可选)需要定义自己的配置,则需要生成配置 ...
- 前端性能之Chrome的Waterfall
浏览器根据HTML中外连资源出现的顺序,依次放入队列(队列),然后根据优先级确定向服务器获取资源的顺序.同优先级的资源根据HTML中出现的先后顺序来向服务器获取资源. 瀑布中各项内容的含义: 排队: ...
- Torvalds的linux
1991年,芬兰人林纳斯•托瓦兹在赫尔辛基大学上学,对操作系统很好奇,并且对MINIX只允许在教育上使用很不满(其不允许任何商业使用),于是开始写他自己的操作系统,这就是后来的Linux内核. 199 ...
- to_datetime 以及 dt.days、dt.months
Series类型的数据,经过 to_datetime 之后就可以用 pandas.Series.dt.day 和 pandas.Series.pd.month. import pandas as pd ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_2_01传统架构演进到分布式架构
笔记 第二章 架构演进和分布式系统基础知识 1.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 (画图) 高可用 LVS+keepalive :负载均衡的知识点 1. ...
- 【汇总】数据库提权(mysql、mssql)
日期:2018-04-03 11:46:45 作者:Bay0net 介绍:利用 mssql 的 sa 账号提权.利用 MySQL 的 UDF 提权 0x01.mssql 提权 恢复 xp_cmdshe ...
- Jmeter之集合点
Jmeter之集合点 Jmeter中也有集合点,看样子还是很强呀 哇哈哈 它只是通过计时器Synchronizing Timer实现的假集合点功能. 没有时间整理,来实际的,直接上图. 在线程下添加集 ...