题意:
给一个无线循环小数的前几位,给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])中的最大就是答案

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define il inline
  5. #define it register int
  6. #define inf 0x3f3f3f3f
  7. #define lowbit(x) (x)&(-x)
  8. #define mem(a,b) memset(a,b,sizeof(a))
  9. #define mod 998244353
  10. const int maxn=1e7+;
  11. ll n,m;
  12. int nexts[maxn];
  13. char s[maxn],s2[maxn];
  14. int p2=;
  15. il void GetNext(int l){
  16. int i=;
  17. int j=-;
  18. nexts[]=-;
  19. while(i<l){
  20. if(j==- || s2[i]==s2[j]){
  21. i++;
  22. j++;
  23. nexts[i] = j;
  24. }
  25. else
  26. j = nexts[j];
  27. }
  28. return;
  29. }
  30. int main(){
  31. while(~scanf("%lld%lld",&n,&m)){
  32. scanf("%s",s);
  33. int l=strlen(s);p2=;
  34. int i;
  35. for(i=;i<l;i++){
  36. if(s[i]=='.'){
  37. break;
  38. }
  39. }
  40. for(int k=l-;k>i;k--){
  41. s2[p2++]=s[k];
  42. }
  43. GetNext(p2);
  44. ll maxx=-1e18;
  45. for(i=;i<=p2;i++){
  46. maxx=max(maxx,(ll)i*n-(ll)(i-nexts[i])*m);
  47. //cout<<i<<" "<<(i-nexts[i])<<endl;
  48. }
  49. printf("%lld\n",maxx);
  50. }
  51. return ;
  52. }

kmp模板

  1. inline void getnext(char *ss){
  2. mem(ne,);
  3. int l=strlen(ss);
  4. int i=,j=-;ne[]=-;
  5. while(i<l){
  6. if (j == - || ss[i] == ss[j])
  7. {
  8. i++;
  9. j++;
  10. ne[i] = j;
  11. }
  12. else{
  13. j = ne[j];
  14. }
  15. }
  16. return;
  17. }
  18. inline int kmp(char *ss,char *s){
  19. int l=strlen(s),ls=strlen(ss);
  20. int i=,j=,ans=;
  21. while(i<l){
  22. if(j==-||s[i]==ss[j])
  23. {
  24. i++;
  25. j++;
  26. }
  27. else
  28. j=ne[j];
  29. if(j==ls)
  30. {
  31. ans++;
  32. j=ne[j];
  33. }
  34. }
  35. return ans;
  36. }

待补全

模板

  1. int next[maxn];
  2. string str[maxn];
  3. void get_next(string s){
  4. memset(next,,sizeof(next));
  5. int len=s.length();
  6. int i,j;
  7. j=next[]=-;
  8. i=;
  9. while(i<len){
  10. while(j!=-&&s[i]!=s[j]) j=next[j];
  11. next[++i]=++j;
  12. }
  13. }
  14. bool kmp(string a,string b){
  15. int lena=a.length();
  16. int lenb=b.length();
  17. get_next(b);
  18. int i=,j=;
  19. while(i<lena){
  20. while(j!=-&&a[i]!=b[j]) j=next[j];
  21. i++,j++;
  22. if(j>=lenb) return true;
  23. }
  24. return false;
  25. }

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. 阿里云IIS服务器SSL证书安装

    一.前提条件 申请证书时需要选择 系统自动创建CSR. 申请证书时如果选择手动创建CSR,则不会生成证书文件.您需要选择其他服务器下载.crt证书文件后,使用openssl命令将.crt文件的证书转换 ...

  2. V-Box

    Not ) (VERR_NEM_NOT_AVAILABLE). VT-x is disabled in the BIOS for all CPU modes (VERR_VMX_MSR_ALL_VMX ...

  3. STM32CubeMX自建MDK工程的基本步骤

    根据需要调节各总线频率 最下方选项,√去掉,不用实时更新库,选择自己库所在路径就好. 点击左侧, 选择"Code Generator", 选择.c 和 .h文件不分开 最后,点击& ...

  4. [AH2017/HNOI2017] 影魔 - 线段树

    #include<bits/stdc++.h> #define maxn 200010 using namespace std; int a[maxn],st[maxn][2],top,L ...

  5. 一个简易git服务器的搭建

    查看本机ssh公钥,生成公钥 查看ssh公钥方法: 1. 打开git bash窗口 2. 进入.ssh目录: cd ~/.ssh 3. 找到id_rsa.pub文件: ls 4. 查看公钥:cat i ...

  6. Linux C语言 文件操作

    打开函数 fopen 的原型如下. FILE * fopen(char *filename, char *mode); 返回值:打开成功,返回该文件对应的 FILE 类型的指针:打开失败,返回 NUL ...

  7. 安装oracle client及配置

    一.下载oracle client 下载地址:https://www.oracle.com/technetwork/database/enterprise-edition/downloads/1120 ...

  8. early-stopping的使用

    early-stopping的使用 待办 https://blog.csdn.net/qq_37430422/article/details/103638681 github对应类导入,直接放在项目更 ...

  9. Matlab技巧1:在同一坐标系上绘制两个函数图像

    x=-:; y1=sqrt(*abs(x)-x.^); y2=asin(abs(x)-)-pi/; plot(x,y1,'r',x,y2,'b') grid 程序结果:

  10. C++——流类库与输入/输出

    I/O流的概念 当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象,流是一种抽象,它负责在数据的生产者和数据的消费者之间建立连接,并管理数据的流动.程序建立一个流对象 ...