2019 진 황도 MUV LUV EXTRA (HDU 6740) 다음 배열 이해

제목:
      어떻게 보면 무 서운 데 사실은 무한 순환 소수 상위 몇 명 을 주 고 순환 절 방안 을 선택 하 라 고 하 는 거 야.
시키다×순환 절 이 이미 나타 나 기 시작 한 부분의 길이 - 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
",ans); } return 0; }

THE END;

좋은 웹페이지 즐겨찾기