2019 秦皇岛 MUV LUV EXTRA (HDU 6740)Next数组理解

题意:

      咋一看挺吓人的,实际就是给你一个无限循环小数的前几位,让你选择一种循环节的方案,

使得a×循环节已经开始出现的部分长度−b×循环节长度 最大。

input:

5 3

1.1020

2 1

12.1212

output:

9 6

思路:

     很显然的求一个Next数组,O(N)扫一遍统计答案即可。关键理解好Next数组的含义,以及上述做法的

正确性。

代码实现:

#include 
#include 
#include 
#include 
#include 

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

const int N = 1e7 + 10;
int nxt[N];
char ch[N],s[N];

int main() {

  int a,b,flag;
  long long ans = -inf;
  while(scanf("%d%d",&a,&b) != EOF) {
    ans = -inf;
    scanf("%s",ch+1);
    flag = -1;
    int len=strlen(ch+1);
    for(int i=1; i<=len; i++) {
      if(ch[i]=='.') {
        flag=0;
        continue;
      }
      if(flag>-1)s[++flag]=ch[i];
    }
    reverse(s+1,s+1+flag);
    for(int i=0; i<=flag; i++)nxt[i]=0;
    nxt[1]=0;
    for(int i=2,j=0; i<=flag; i++) {
      while(j>0&&(s[i]!=s[j+1]))j=nxt[j];
      if(s[i] == s[j+1])j++;
      nxt[i]=j;
    }

    for(int i=1; i<=flag; i++) {
      ans = max(ans, (long long)a*i-(long long)b*((long long)i-nxt[i]));
    }
    printf("%lld\n",ans);
  }
  return 0;
}

THE END;

你可能感兴趣的:(区域赛,数据结构KMP)