ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-28 20:00:42  阅读:444  来源: 互联网

标签:... MUV LUV EXTRA decimal Sumika length she repeating


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 642ccpcQHD  

题解:

是个套了外壳的字符串题,求的是后缀的循环节长度和循环节出现的总长度(包含不完整循环节),

显然反过来后跑一下kmp求出next数组,枚举前缀,那么i就是循环节出现的总长度,而i−next[i]就是循环节长度了,

直接更新最大值,答案可能有负数,初值要设为-1e18,2A。

参考代码:

#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\n",ans);
    }
      return 0;
}
View Code

 

标签:...,MUV,LUV,EXTRA,decimal,Sumika,length,she,repeating
来源: https://www.cnblogs.com/songorz/p/11604614.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有