题意:
给一个无线循环小数的前几位,给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最小循环节的更多相关文章

  1. hdu 3746 Cyclic Nacklace(kmp最小循环节)

    Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...

  2. HDU - 4333 Revolving Digits(拓展kmp+最小循环节)

    1.给一个数字字符串s,可以把它的最后一个字符放到最前面变为另一个数字,直到又变为原来的s.求这个过程中比原来的数字小的.相等的.大的数字各有多少. 例如:字符串123,变换过程:123 -> ...

  3. hdu3746(kmp最小循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 题意:问在一个字符串末尾加上多少个字符能使得这的字符串首尾相连后能够循环 题解:就是利用next ...

  4. Cyclic Nacklace hdu3746 kmp 最小循环节

    题意:给出一段字符串  求最少在最右边补上多少个字符使得形成循环串(单个字符不是循环串) 自己乱搞居然搞出来了... 想法是:  如果nex[len]为0  那么答案显然是补len 否则  答案为循环 ...

  5. HDU1358 Period —— KMP 最小循环节

    题目链接:https://vjudge.net/problem/HDU-1358 Period Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  6. HDU3746 Cyclic Nacklace —— KMP 最小循环节

    题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    M ...

  7. Common Divisors CodeForces - 182D || kmp最小循环节

    Common Divisors CodeForces - 182D 思路:用kmp求next数组的方法求出两个字符串的最小循环节长度(http://blog.csdn.net/acraz/articl ...

  8. UVAlive 3026 KMP 最小循环节

    KMP算法: 一:next数组:next[i]就是前面长度为i的字符串前缀和后缀相等的最大长度,也即索引为i的字符失配时的前缀函数. 二:KMP模板 /* pku3461(Oulipo), hdu17 ...

  9. 【KMP+最小循环节】F. Cyclic Nacklace

    https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/F [题意] 给定一个字符串,问在字符串后最少添加多少个字母,得到的新字符串能是前 ...

随机推荐

  1. jvm编译器的优化

    1.对byte.short.char赋值时,若右边范围没有超过左边类型的最大表达范围则会自动隐式的加上(byte).(short).(char)强制转换:若右边范围超过了左边类型的最大表达范围则编译失 ...

  2. Qt多线程实现思路二

    建立一个继承于Qobject的类myThread 在类myThread中定义线程处理函数不必是思路一里的run(); 在窗口类中开辟一个自定义线程myThread的指针对象myT = new myTh ...

  3. C语言 continue

    C语言 continue 在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句. 案例 #include<stdio.h> int main() { ...

  4. 题解【AcWing902】最短编辑距离

    题面 经典的最长公共子序列模型. 我们设 \(dp_{i,j}\) 表示 \(a_{1...i}\) 与 \(b_{1...j}\) 匹配上所需的最少操作数. 考虑删除操作,我们将 \(a_i\) 删 ...

  5. Failed to set locale, defaulting to C

    echo "export LC_ALL=en_US.UTF-8" >> /etc/profile source /etc/profile 没有设置local环境

  6. C++类this指针为空时的几个误区

    代码: class test{ public: static void f1(){cout<<y<<endl;} void f2(){cout<<y<< ...

  7. STL初学

    标准模板库STL初学 线性数据结构 vector 一维向量,相当于数组 list 链表 map 映射,提供(Key,Value)式操作,相当于哈希表 string char字符串 queue 队列,先 ...

  8. 判断IE版本的HTML语句[if lte IE 9]……[endif]

    我们常常会在网页的HTML里面看到形如[if lte IE 9]……[endif]的代码,表示的是限定某些浏览器版本才能执行的语句,那么这些判断语句的规则是什么呢?请看下文: <!--[if ! ...

  9. python 删除git Jenkinsfile文件

    背景:在做ci集成的发现分支超过100个之后,pipline activity列表中前期的分支会被隐藏,这导致master分支在活动视图中不可见 解决方案:删除历史分支的Jenkinsfile 分支太 ...

  10. 在SQL2005中修改数据库名称

    SQL Server 2005中有个数据库HT_WisdomDataBaseCenter,现在要将其改名为HT_NBSBOneNetcs1步骤:(1) 分离数据库:打开management studi ...