原题:

题意:

给你两个整数a和b,再给你一个正小数,整数部分忽略不计,只考虑小数部分的循环节,对于所有可能的循环节,令其长度为l,在小数部分循环出现的长度为p,最后一个循环节允许不完整,但是缺少的部分不计入循环长度

问你a*p-b*l的最小值是多少

考虑的循环节必须至少在小数部分中出现一次,小数部分的前缀可以不属于循环部分

这题也是一眼很棘手,和后缀数组和后缀自动机似乎都有相似之处

但是实际做法是kmp

翻转原串是关键思路,这样保证了能把原串前缀的不是循环部分的部分忽略掉,从而方便地利用next数组的性质

把小数部分串反过来,那么这个串的前缀就一定是循环部分

因为最后循环节允许不完整,所以考虑把一个循环节分成AB两部分,其中B是最后一个循环节缺的部分

考虑next数组的性质:next[i]表示子串[1,i]最长的前后缀长度,使得此长度的前后缀相等

那么对于ACA形式的串,其中A指最长的相同前后缀,把C接到A后边就可以变成ACA(C)的循环形式,前后缀有相交情况时同理

对于循环部分[1,i],出现长度就是i,出现长度固定,只需求出此时长度最小的循环节

由next的性质,保证[1,i-next[i]]是最小的循环节

可以反证,考虑ABABABABA,如果它被i-nxt[i]和next[i]+1划分为ABA BAB ABA,即认为[1,6]和[4,9]是相同的前后缀,且有多余的循环节被统计到了[1,i-nxt[i]]和[nxt[i]+1,i]里

那么此时可以从[1,i-nxt[i]]和[nxt[i],i]中各拿出一个循环节放到中间,易证此时仍然符合next[i]的性质,即之前求出的next[i]是错误的

所以得证,[1,i-next[i]]一定是最小的循环节

那么把小数部分倒过来,从左到右扫一遍,每次根据next[i]计算,然后统计到答案即可

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define LL long long
LL a,b;
char s[];
int c[],n=;
int nxt[];
LL ans;
void gtnxt(){
int tmp=;
nxt[]=;
for(int i=;i<=n;++i){
while(tmp&&c[tmp+]!=c[i]) tmp=nxt[tmp];
if(c[tmp+]==c[i]) ++tmp;
nxt[i]=tmp;
/*if(nxt[i]){
if(nxt[i]>=i-nxt[i]+1) ans=max(ans,a*i-b*(i-nxt[i]));
if(nxt[i]==i-nxt[i]) ans=max(ans,a*i-b*nxt[i]);
ans=max(ans,a*i*/
if(nxt[i]) ans=max(ans,a*i-b*(i-nxt[i]));
}
}
int main(){
//freopen("ddd.in","r",stdin);
while(scanf("%lld%lld",&a,&b)!=EOF){
ans=-1e18,n=;
scanf("%s",s);
for(int i=strlen(s)-;i>=;--i){
if(s[i]=='.') break;
c[++n]=s[i]-'';
}
if(a-b>) ans=(a-b)*n;
else ans=a-b;
gtnxt();
cout<<ans<<endl;
/*for(int i=1;i<=n;++i) cout<<c[i]<<" ";
cout<<endl;
for(int i=1;i<=n;++i) cout<<nxt[i]<<" ";
cout<<endl;*/
}
return ;
}

【2019 CCPC 秦皇岛】J - MUV LUV EXTRA的更多相关文章

  1. 2019CCPC秦皇岛 J MUV LUV EXTRA(KMP)

    MUV LUV EXTRA Time Limit: 2000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)T ...

  2. HDU6740 2019CCPC秦皇岛赛区 J. MUV LUV EXTRA

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6740思路:求小数部分后k位的真前后缀 倒着kmp就好 #include<bits/stdc++.h& ...

  3. 2019CCPC秦皇岛 K MUV LUV UNLIMITED(博弈)

    MUV LUV UNLIMITED Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  4. 2019 ccpc 秦皇岛

    D 如果1/n是有限小数,不停乘以10,一定在有限次之后成为一个整数. 10的质因子只有2和5,只要保证分母的质因子只有2和5即可 #include <iostream> #include ...

  5. 2019 ccpc秦皇岛

    1006 (dfs) #include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const dou ...

  6. 2019 CCPC wannfly winter camp Day 5

    C - Division 思路:我们考虑到一点,从大往小取得顺序是不会有问题的,所以可以直接主席树,但是开不下空间,我们可以log分段求. #include<bits/stdc++.h> ...

  7. 2019 CCPC wannfly winter camp Day 8

    E - Souls-like Game 直接线段树合并矩阵会被卡T掉,因为修改的复杂度比询问的复杂度多一个log,所以我们考虑优化修改. 修改的瓶颈在于打lazy的时候, 所以我们预处理出每个修改矩阵 ...

  8. 2019.ccpc女生赛-wfinal总结

    2019ccpc女生赛离它结束有四天了,在这个期间我想了很多,想了想还是决定写这个总结.作为这个队伍唯一的一名大一队员,我很庆幸,能跟着两个学姐一起打比赛,计爱玲师姐,即将工作,张莹俐学姐.这估计都是 ...

  9. 2017 CCPC秦皇岛 M题 Safest Buildings

    PUBG is a multiplayer online battle royale video game. In the game, up to one hundred players parach ...

随机推荐

  1. Java进程监控

    目录 1.引言 2. 程序启停, 为进程自定义项目名称 3. 操作系统判断 4. 获取进程信息 5. 内存,CPU信息 6. 堆内存信息 7. 端口信息 8. 线程信息 9. MXBean使用样例 9 ...

  2. 《剑指offer》数组专题 (牛客10.22)

    目录 // Q01 二维部分有序数组查找 [善用性质] // Q06 旋转数组中的最小元素 [二分 || 暴力] Q13 调整数组顺序使奇数位于偶数前 / Q19 顺时针打印矩阵 [使用边界变量] / ...

  3. 【ARM-Linux开发】 pkg-config的用法

    pkg-config 是一个提供从源代码中编译软件时查询已安装的库时使用的统一接口的计算机软件.pkg-config原本是设计用于Linux的,但现在在各个版本的BSD.windows.Mac OS ...

  4. NDK学习笔记-使用现有so动态库

    前面将的都是如何使用C/C++文件生成so动态库,那么在使用别人的so动态库的时候应该怎么做呢?这篇文章就是使用一个变声功能的动态库,完成对于以有so动态库的说明. 动态库来源 在互联网中,有着许许多 ...

  5. 【IDEA】格式化代码技巧汇总

    1.格式化 Java 代码 快捷键:Ctrl+Alt+L 2.格式化 Mapper 文件中的 SQL 关联到数据库,让 IDEA 认识你的 SQL.如何关联?选择右侧的database,添加数据库即可 ...

  6. C#实现多线程的方式:Task——任务

    简介 .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能. 在后台使用ThreadPool. 任务表示应完成的某个单元的工作. 这个单元的工作可以在单 ...

  7. SSH连接时root用户无法验证通过

    解决办法是: vi /etc/ssh/sshd_config 找到 # Authentication: PermitRootLogin without passwd 改成 # Authenticati ...

  8. nasm 使用总结

    1,编译 nasm -f bin myfile.asm -o myfile  生成目标文件 nasm -f bin myfile.asm -l myfile   生成清单文件 2,快速开始 nasm是 ...

  9. WPF入门(2)——数据绑定与INotifyPropertyChanged(INPC)

    接上篇,我们在MainViewModel类中创建个属性: public string Name { get; set; } 然后去UI的xaml文件中binding一下: 此时运行程序是不会得到我们想 ...

  10. 1、ECharts(中国地图篇)的使用

    一.网址:            http://echarts.baidu.com/download.html点击:            完整下载文件:        echarts.min.js ...