HDU 6740 kmp最小循环节
题意:
给一个无线循环小数的前几位,给n,m
选择其中一种出现在前几位的循环节方式(a个数),循环节的长度b
使得n*a-m*b最大
样例:
2 1
12.1212
输出 6
选择2,2*1-1*1=1;
选择12,2*4-2*1=6;
选择21,2*3-2*1=4;
选择212,2*3-3*1=3;
选择1212,2*4-4*1=4;
思路:
将小数部分,倒过来,求每个点的最小循环节,kmp中i-next[i]代表最小循环节
当倒过来的小数部分,n*i-m*(i-next[i])中的最大就是答案
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 998244353
const int maxn=1e7+;
ll n,m;
int nexts[maxn];
char s[maxn],s2[maxn];
int p2=;
il void GetNext(int l){
int i=;
int j=-;
nexts[]=-;
while(i<l){
if(j==- || s2[i]==s2[j]){
i++;
j++;
nexts[i] = j;
}
else
j = nexts[j];
}
return;
}
int main(){
while(~scanf("%lld%lld",&n,&m)){
scanf("%s",s);
int l=strlen(s);p2=;
int i;
for(i=;i<l;i++){
if(s[i]=='.'){
break;
}
}
for(int k=l-;k>i;k--){
s2[p2++]=s[k];
}
GetNext(p2);
ll maxx=-1e18;
for(i=;i<=p2;i++){
maxx=max(maxx,(ll)i*n-(ll)(i-nexts[i])*m);
//cout<<i<<" "<<(i-nexts[i])<<endl;
}
printf("%lld\n",maxx);
}
return ;
}
kmp模板
inline void getnext(char *ss){
mem(ne,);
int l=strlen(ss);
int i=,j=-;ne[]=-;
while(i<l){
if (j == - || ss[i] == ss[j])
{
i++;
j++;
ne[i] = j;
}
else{
j = ne[j];
}
}
return;
}
inline int kmp(char *ss,char *s){
int l=strlen(s),ls=strlen(ss);
int i=,j=,ans=;
while(i<l){
if(j==-||s[i]==ss[j])
{
i++;
j++;
}
else
j=ne[j];
if(j==ls)
{
ans++;
j=ne[j];
}
}
return ans;
}
待补全
模板
int next[maxn];
string str[maxn];
void get_next(string s){
memset(next,,sizeof(next));
int len=s.length();
int i,j;
j=next[]=-;
i=;
while(i<len){
while(j!=-&&s[i]!=s[j]) j=next[j];
next[++i]=++j;
}
}
bool kmp(string a,string b){
int lena=a.length();
int lenb=b.length();
get_next(b);
int i=,j=;
while(i<lena){
while(j!=-&&a[i]!=b[j]) j=next[j];
i++,j++;
if(j>=lenb) return true;
}
return false;
}
HDU 6740 kmp最小循环节的更多相关文章
- hdu 3746 Cyclic Nacklace(kmp最小循环节)
Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...
- HDU - 4333 Revolving Digits(拓展kmp+最小循环节)
1.给一个数字字符串s,可以把它的最后一个字符放到最前面变为另一个数字,直到又变为原来的s.求这个过程中比原来的数字小的.相等的.大的数字各有多少. 例如:字符串123,变换过程:123 -> ...
- hdu3746(kmp最小循环节)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 题意:问在一个字符串末尾加上多少个字符能使得这的字符串首尾相连后能够循环 题解:就是利用next ...
- Cyclic Nacklace hdu3746 kmp 最小循环节
题意:给出一段字符串 求最少在最右边补上多少个字符使得形成循环串(单个字符不是循环串) 自己乱搞居然搞出来了... 想法是: 如果nex[len]为0 那么答案显然是补len 否则 答案为循环 ...
- HDU1358 Period —— KMP 最小循环节
题目链接:https://vjudge.net/problem/HDU-1358 Period Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- HDU3746 Cyclic Nacklace —— KMP 最小循环节
题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) M ...
- Common Divisors CodeForces - 182D || kmp最小循环节
Common Divisors CodeForces - 182D 思路:用kmp求next数组的方法求出两个字符串的最小循环节长度(http://blog.csdn.net/acraz/articl ...
- UVAlive 3026 KMP 最小循环节
KMP算法: 一:next数组:next[i]就是前面长度为i的字符串前缀和后缀相等的最大长度,也即索引为i的字符失配时的前缀函数. 二:KMP模板 /* pku3461(Oulipo), hdu17 ...
- 【KMP+最小循环节】F. Cyclic Nacklace
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/F [题意] 给定一个字符串,问在字符串后最少添加多少个字母,得到的新字符串能是前 ...
随机推荐
- javascript 权威指南1
JavaScript是面向web的编程语言 web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的.全球性的.动态交互的.跨平台的分布式图形信息系统.是建立在 ...
- uva1428树状数组
用树状数组统计每个点i,左边与右边与多少个点小于a[i],然后用乘法原理和加法原理得出答案 #pragma GCC optimize(2) #include <bits/stdc++.h> ...
- 关于MySQL数据库中null的那些事
在mysql数据库中,null是一个经常出现的情况,关于mysql中的null,有哪些注意事项呢?下面简单总结归纳下,后续会不断补充. 1. is null 首先判断数据库中某一列的值是否为null, ...
- JDK下载安装与环境变量配置图文教程【超详细】
JDK下载安装与环境变量配置图文教程[超详细] 创建时间:2019年11月13日11时02分 文章目录 1. JDK介绍 1.1 什么是JDK? 1.2 JDK版本介绍 2. JDK下载与安装 3.w ...
- Socket之TCP-IP
通常的TCP/IP流程如下: TCP/IP的通讯更像是打电话,连接上通了确认是自己拨叫的用户之后才能进行正常通话,更加安全合理. Qt中的TCP/IP流程如下: Qt中流程和普通的思路一样,只是封装成 ...
- Docker最全教程——从理论到实战(二十一)
前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过此块,本篇仅从笔者角度进行总结和编写. 目录 镜像说明 运行MySQL容器镜像 1.运行MySQL容器 ...
- 三分钟学会.NET Core Jwt 策略授权认证
一.前言 大家好我又回来了,前几天讲过一个关于Jwt的身份验证最简单的案例,但是功能还是不够强大,不适用于真正的项目,是的,在真正面对复杂而又苛刻的客户中,我们会不知所措,就现在需要将认证授权这一块也 ...
- Android Studio阶段性学习总结_1
这半个月一直在学习Android方面的知识,对Android开发有了一个基本的认识,学会了Android studio的基本操作. 在建立第一个Android studio项目时,我遇到了很大的阻碍, ...
- 使用SVN更新项目后出现冲突说明
使用Update后出现多个文件,并且报错!! R.java.mine R.java.r21965 R.java.r23204 下面以自动生成R.java.mine,R.java.r21965, ...
- 1、安装gitlab
1.安装Gitlab Gitlab分为社区版和企业版(收费),这里安装的是ce社区版本 方式一: Gitlab官方有提供好的rpm包仓库,所以采用yum安装即可. [root@localhost ~] ...