【BZOJ-4180】字符串计数 后缀自动机 + 矩阵乘法
4180: 字符串计数
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 146 Solved: 66
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
ABCCAD
Sample Output
HINT
Source
Solution
人傻不会做...于是看的题解...
Code
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define LL long long
#define MAXN 500010
#define INF (1LL<<62) LL N;
char S[MAXN]; int last=1,sz=1,root=1,par[MAXN<<1],len[MAXN<<1],son[MAXN][4];
LL f[MAXN][4];
inline void Extend(int c)
{
int cur=++sz,p=last;
len[cur]=len[p]+1;
while (p && !son[p][c]) son[p][c]=cur,p=par[p];
if (!p) par[cur]=root;
else {
int q=son[p][c];
if (len[p]+1==len[q]) par[cur]=q;
else {
int nq=++sz;
memcpy(son[nq],son[q],sizeof(son[nq]));
len[nq]=len[p]+1; par[nq]=par[q];
while (p && son[p][c]==q) son[p][c]=nq,p=par[p];
par[q]=par[cur]=nq;
}
}
last=cur;
} bool visit[MAXN<<1];
inline void Dfs(int now)
{
if (visit[now]) return;
visit[now]=1;
for (int c=0; c<4; c++)
if (son[now][c])
Dfs(son[now][c]),f[now][c]=INF;
else f[now][c]=1;
for (int c=0; c<4; c++)
if (son[now][c])
for (int cc=0; cc<4; cc++)
f[now][cc]=min(f[now][cc],f[son[now][c]][cc]+1);
} struct Matrix{
LL a[4][4];
Matrix() {for (int i=0; i<4; i++) for (int j=0; j<4; j++) a[i][j]=INF;}
LL* operator [](int x) {
return a[x];
}
}X; Matrix operator * (Matrix &A,Matrix &B) {
Matrix C;
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
for (int k=0; k<4; k++)
C[i][j]=min(C[i][j],A[i][k]+B[k][j]);
return C;
} Matrix operator ^ (Matrix x,LL y) {
Matrix re;
memset(re.a,0,sizeof(re.a));
for (int i=0; i<4; i++) re[i][i]=1;
for ( ; y; y>>=1,x=x*x) if (y&1) re=re*x;
return re;
} inline bool check(LL x)
{
Matrix B=X^x;
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
if (B[i][j]+1<=N) return 1;
return 0;
} int main()
{
scanf("%lld%s",&N,S+1); int L=strlen(S+1); for (int i=1; i<=L; i++) Extend(S[i]-'A'); Dfs(root); for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
X[i][j]=f[son[root][i]][j]; // for (int i=0; i<4; i++,puts(""))
// for (int j=0; j<4; j++) printf("%I64d ",X[i][j]==INF? -1:X[i][j]); LL l=0,r=N+1,mid,ans=0;
while (l<=r) {
mid=(l+r)>>1;
if (check(mid)) l=mid+1;
else r=(ans=mid)-1;
}
printf("%lld\n",ans); return 0;
}
/*
5
ABCCAD
*/
【BZOJ-4180】字符串计数 后缀自动机 + 矩阵乘法的更多相关文章
- BZOJ 4180: 字符串计数 后缀自动机 + 矩阵乘法 + 二分(神题)
Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C ...
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
- BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...
- BZOJ 3473: 字符串 [广义后缀自动机]
3473: 字符串 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 354 Solved: 160[Submit][Status][Discuss] ...
- bzoj 2553: [BeiJing2011]禁忌 AC自动机+矩阵乘法
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2553 题解: 利用AC自动机的dp求出所有的转移 然后将所有的转移储存到矩阵中,进行矩阵 ...
- bzoj 3277: 串 & bzoj 3473: 字符串【后缀自动机||后缀数组】
建一个广义后缀自动机(每加完一个串都返回root),在parent树上dpsum记录合法长度,打着时间戳往上跳,最后每个串在自动机上跑一变统计答案即可. 后缀数组理解起来可能方便一点,但是难写,就只说 ...
- bzoj 4180: 字符串计数
Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', ...
- 「bzoj 4180: 字符串计数」
题目 真是一道好题 首先根据一个非常显然的贪心,如果给出了一个串\(S\),我们如何算最小操作次数呢 非常简单,我们直接把\(S\)拉到\(T\)的\(SAM\)上去跑,如果跑不动了就停下来,重新回到 ...
- BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)
标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...
随机推荐
- bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战
http://www.lydsy.com/JudgeOnline/problem.php?id=2286 虚树上树形DP #include<cmath> #include<cstdi ...
- Python 算法实现
# [程序1] # 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? l=[1,2,3,4] count = 0 for i in range(len(l)): fo ...
- 20145226 《Java程序设计》第七周学习总结
教材学习内容总结 学习目标 · 了解Lambda语法 · 了解方法引用 · 了解Fucntional与Stream API · 掌握Date与Calendar的应用 · 会使用JDK8新的时间API ...
- CF11D A Simple Task(状压DP)
\(solution:\) 思路大家应该都懂: 状压DP:\(f[i][j]\),其中 \(i\) 这一维是需要状压的,用来记录19个节点每一个是否已经走过(走过为 \(1\) ,没走为 \(0\) ...
- Strange Queries(莫队)
题目 You are given an array with n integers a1, a2, ..., an, and q queries to answer. Each query consi ...
- Twisted框架
Twisted是一个事件驱动型的网络模型.时间驱动模型编程是一种范式,这里程序的执行流由外部决定.特点是:包含一个事件循环,当外部事件发生时,使用回调机制来触发相应的处理. 线程模式: 1.单线程同步 ...
- springboot整合Thymeleaf模板引擎
引入依赖 需要引入Spring Boot的Thymeleaf启动器依赖. <dependency> <groupId>org.springframework.boot</ ...
- Project Euler Problem1
Multiples of 3 and 5 Problem 1 If we list all the natural numbers below 10 that are multiples of 3 o ...
- 如何使用windows的计划任务?计划任务?
我们经常有一些程序想要过了几小时来运行:比如定时关机 或者说希望能够每天的几点执行一个什么程序: 这些所有的操作都需要用到windows的任务计划:或者叫计划任务:反正都一样 下面小编将指导大家创建一 ...
- postman发送json请求,使用案例
介绍: postman是一个很好的http模拟器,,可以发送get.post.put等各种请求,是测试服务接口相当好的工具. postman发送json请求,使用案例 发送json的具体步骤: 1. ...