【JZOJ6213】【20190613】String
题目
\(n \le 10^{18} \ , \ |T| \le 10^5\)
题解
显然,最少的操作次数一定是贪心地能匹配就匹配
我们可以建出\(T\)的SAM,把SAM不能走的边补到根的后继节点
问题变成在SAM上设计一条长度为\(n\)的路径使得它绕回根的次数最多
由于字符集为4,并且我们只关心绕回根的次数
可以在SAM上dp预处理一个\(4 \times 4\)的矩阵表示从\(x\)开头经过根到\(y\)开头的最小长度
二分答案,矩阵快速幂check
考场没有想到二分,直接搜索了一下ABCD的顺序然后重复走中间的环,水过去了。。
#include<bits/stdc++.h>
#define ll long long
#define inf 1e9 using namespace std; const int N=200010;
int l,cnt,ch[N][4],fa[N],len[N],d[N],a[10],used[N];
char s[N];
ll n,ans=1,f[N],dis[4][4]; void chkmn(ll&x,ll y){if(x>y)x=y;}
void chkmx(ll&x,ll y){if(x<y)x=y;} void pre_dfs(int u){
if(used[u])return;
used[u]=1;
for(int i=0;i<4;++i){
int v=ch[u][i];
if(!v)continue;
d[v]++;
pre_dfs(v);
}
} void get_dis(int I){
static queue<int>q;
q.push(ch[1][I]);
f[ch[1][I]]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<4;++i){
int v=ch[u][i];
if(!v){chkmn(dis[I][i],f[u]);continue;}
chkmn(f[v],f[u]+1);
if(!--d[v])q.push(v);
}
}
} void get_ans(int m){
static int vis[4],s1,s2,s3,st[10],tp;
for(int i=s1=s2=s3=0;i<4;++i)vis[i]=0;
vis[st[tp=1]=a[0]]=1;
for(int i=1;i<m;++i){
s1+=dis[a[i-1]][a[i]];
if(vis[a[i]]){
int lst=a[i];
while(1){
s2+=dis[st[tp]][lst];s3++;
if(st[tp]==a[i])break;
vis[st[tp]]=0;
lst=st[tp--];
}
continue;
}
vis[st[++tp]=a[i]]=1;
}
if(n<=s1)return;
chkmx(ans, m);
if(s2)chkmx(ans, m+1ll*(n-1-s1)/s2*s3);
} void dfs(int x){
if(x>8)return;
if(x>1)get_ans(x);
for(int i=0;i<4;++i){
a[x]=i;
dfs(x+1);
}
} int main(){
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
scanf("%lld%s",&n,s);l=strlen(s);
cnt=1;
for(int i=0,lst=1;i<l;++i){
int x=s[i]-'A',p=lst,np=++cnt;
len[lst=np]=len[p]+1;
while(p&&!ch[p][x])ch[p][x]=np,p=fa[p];
if(!p){fa[np]=1;continue;}
int q=ch[p][x];
if(len[q]==len[p]+1)fa[np]=q;
else{
int nq=++cnt;
len[nq]=len[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];fa[np]=fa[q]=nq;
while(p&&ch[p][x]==q)ch[p][x]=nq,p=fa[p];
}
} for(int i=0;i<4;++i)if(!ch[1][i]){return cout<<n<<endl,0;}
memset(dis,0x3f,sizeof(dis));
memset(f,0x3f,sizeof(f)); for(int i=0;i<4;++i){
for(int j=1;j<=cnt;++j)d[j]=used[j]=0;
pre_dfs(ch[1][i]);
get_dis(i);
} dfs(0); cout<<ans<<endl; return 0;
}
【JZOJ6213】【20190613】String的更多相关文章
- 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder
[重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder 1.String String是Java中的一个final ...
- Android NDK 【错误】The method loadLibrary(String) is undefined for the type Settings.Syste
[错误]The method loadLibrary(String) is undefined for the type Settings.System [解决方法] 不要加入包import andr ...
- 【动态规划】【最短路】Codeforces 710E Generate a String
题目链接: http://codeforces.com/problemset/problem/710/E 题目大意: 问写N个字符的最小花费,写一个字符或者删除一个字符花费A,将当前的字符数量翻倍花费 ...
- 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
[手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...
- 【C++探索之旅】第二部分第一课:面向对象初探,string的惊天内幕
内容简单介绍 1.第二部分第一课:面向对象初探.string的惊天内幕 2.第二部分第二课预告:掀起了"类"的盖头来(一) 面向对象初探,string的惊天内幕 上一课<[C ...
- 【LeetCode】678. Valid Parenthesis String 解题报告(Python)
[LeetCode]678. Valid Parenthesis String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人 ...
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
随机推荐
- Java Base64Utils
Java Base64Utils /** * <html> * <body> * <P> Copyright 1994 JsonInternational</ ...
- C# 练习题 利用条件运算符的嵌套来完成分数等级划分
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示.1.程序分析:(a>b)?a:b这是条件运算符的基本例子. cla ...
- spring Boot 学习(六、Spring Boot与分布式)
一.分布式应用在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用 全栈的Spring,Spring Boot+Spring Cloud 分布式系统: 单一应用 ...
- docker mac 命令行登录报错处理 : Error saving credentials: error storing credentials - err: exit status 1
参考:https://blog.csdn.net/xufwind/article/details/88756557 比较新版本的docker命令行登录会出现以下错误: Error saving cre ...
- WC2018 文艺汇演《退役的你》
视频网址:https://www.bilibili.com/video/av19333297 谨以此歌献给那些曾与我们并肩前行的退役 OIer 填词 & 视频:Menci 演唱:wxh0109 ...
- HTML5深入学习之 WebSQL 数据库
概述 WebSQL 并不是 HTML5规范的一部分,而是一个独立的规范,它可以用来做一些离线应用 核心API openDatabase() => 用来打开或创建数据库(没有时则创建,有则打开) ...
- Spring中基于注解的IOC(二):案例与总结
2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...
- vim替换字符串
1. s 命令来替换字符串 :s/vivian/sky/ #替换当前行第一个 vivian 为 sky :s/vivian/sky/g #替换当前行所有 vivian 为 sky :n,$s/vivi ...
- Java JDBC结果集的处理
结果集指针的移动 while (resultSet.next()){ //...... } 指针最初指向第一条记录之前,next()是指向下一个位置,返回的是boolean值,true表示有内容(记录 ...
- BBC评出的100本最具影响力经典书籍
今年,英国广播公司(BBC)邀请全球35个国家共108名文化人士,参与其发起的“影响思维和历史的100部虚构故事”的推荐,要求每人最多提名 5 部作品,这些作品最终将根据提名总量排名. 该活动经过一个 ...