zoukankan      html  css  js  c++  java
  • 2019CCPC秦皇岛 J MUV LUV EXTRA(KMP)

    MUV LUV EXTRA

    Time Limit: 2000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
    Total Submission(s): 134    Accepted Submission(s): 49


    Problem Description
    One day, Kagami Sumika is stuck in a math problem aiming at calculating the length of a line segment with given statements and constraints. Since Sumika has no idea about it, she takes out a ruler and starts to measure the length. Unfortunately, the answer is an infinite decimal and she only got the first some digits of the answer from the ruler.
    Sumika guesses that the answer is a rational number, which means that there exists two integers p, q that the answer equals qp. In this situation, the answer can be expressed as an infinte repeated decimal. For example, 12 = 0.500 ... , 13 = 0.333 .... , 910= 0.8999 ... ,3635= 1.0285714285714 ... .Sumika wants to guess the original number from the digits she got. Note that a number may has more than one way to be expressed such as 1.000 ... = 0.999 ... . Sumika won’t transform the digits she got to another form when guessing the original number.
    Furthermore, Sumika relizes that for a repeating part, either too long or the appeared length too short will make the result unreliable. For example, if the decimal she measured is 1.0285714285714, it is obviously unreliable that the repeating part is “0285714285714”, since it is too long, or “428571”, since the appeared length is too short, which equals 7, the length of “4285714”. In this case, the best guess is “285714”, whose length is 6 and the appeared length is 12. So formally, she defines the reliability value of a repeating part, whose length is l and the appeared length is p, as the following formula:
    a * p - b * l

    Where a and b are given parameters.
    Last but not least, you can ignore the integer parts of the decimal. It is just for restoring the scene. And the repeating part you guess should be completely repeated at least once and is still repeating at the end currently.
    Please help Sumika determine the maximum reliability value among all repeating parts.
     
    Input
    The first line contains two positive integers a, b (1 ≤ a, b ≤ 109), denoting the parameters.
    The next line contains a string s (1 ≤ |s| ≤ 107) in decimal form, denoting the first some digits of the accurate result.
    It is guaranteed that there is exactly one decimal point in s and s is a legal non-negative decimal without leading "-"(the minus sign).
     
    Output
    Output a single line containing an integer, denoting the maximum reliability value.
     
    Sample Input
    5 3 1.1020 2 1 12.1212
     
    Sample Output
    9 6
     
    Source
     

    题解:

    是个套了外壳的字符串题,求得是后缀的循环节长度和循环节出现的总长度(包括不完整循环节),显然我们反过来求kmp得next数组,枚举前缀,那么i就是循环节出现的总长度,而i-next[i]就是循环节长度。

    参考代码:

    #include<bits/stdc++.h>
    #define maxl 10000010
    using namespace std;
    
    const long long inf=1ll<<61;
    long long a,b,ans;
    int slen,tlen;
    int nxt[maxl];
    char s[maxl],t[maxl];
    
    inline void mainwork()
    {
          ans=a-b;
          int j=0;nxt[1]=0;
          for(int i=2;i<=tlen;i++)
        {
              while((j && t[j+1]!=t[i]) || (j==tlen))
            j=nxt[j];
              if(t[j+1]==t[i] && j+1<=tlen)
            j++;
              nxt[i]=j;ans=max(ans,a*i-b*(i-nxt[i]));
        }
    }
    
    int main()
    {
          while(~scanf("%lld%lld",&a,&b))
        {
              scanf("%s",s+1);
              slen=strlen(s+1);tlen=0;
              for(int i=slen;i>=1;i--)
                if(s[i]=='.')
                      break;
                else
                    t[++tlen]=s[i];
              mainwork();
            printf("%lld
    ",ans);
        }
          return 0;
    }
    View Code
  • 相关阅读:
    关于遇到问题的解决方法(仅此献给初学者吧,我工作还没两年,这点经验对于大神,不值一谈的)
    chm TO html 另类方法
    Android EditText setOnClickListener事件 只有获取焦点才能响应 采用setOnTouchListener解决
    Jquery UI 中Tree组件的json格式,java递归拼接demo
    汇编 二则运算
    创建 macvlan 网络
    准备 macvlan 环境
    overlay 是如何隔离的?- 每天5分钟玩转 Docker 容器技术(53)
    overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)
    在 overlay 中运行容器
  • 原文地址:https://www.cnblogs.com/csushl/p/11604614.html
Copyright © 2011-2022 走看看