zoukankan      html  css  js  c++  java
  • 687. Repeats spoj (后缀数组 重复次数最多的连续重复子串)

    687. Repeats

    Problem code: REPEATS


     

    A string s is called an (k,l)-repeat if s is obtained by concatenating k>=1 times some seed string t with length l>=1. For example, the string

    s = abaabaabaaba

    is a (4,3)-repeat with t = aba as its seed string. That is, the seed string t is 3 characters long, and the whole string s is obtained by repeating t 4 times.

    Write a program for the following task: Your program is given a long string u consisting of characters ‘a’ and/or ‘b’ as input. Your program must find some (k,l)-repeat that occurs as substring within u with k as large as possible. For example, the input string

    u = babbabaabaabaabab

    contains the underlined (4,3)-repeat s starting at position 5. Since u contains no other contiguous substring with more than 4 repeats, your program must output the maximum k.

    Input

    In the first line of the input contains H- the number of test cases (H <= 20). H test cases follow. First line of each test cases is n - length of the input string (n <= 50000), The next n lines contain the input string, one character (either ‘a’ or ‘b’) per line, in order.

    Output

    For each test cases, you should write exactly one interger k in a line - the repeat count that is maximized.

    Example

    Input:
    1
    17
    b
    a
    b
    b
    a
    b
    a
    a
    b
    a
    a
    b
    a
    a
    b
    a
    b
    
    Output:
    4

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <math.h>
     4 #include <vector>
     5 #include <string.h>
     6 using namespace std;
     7 #define N 50002
     8 char a[N];
     9 int c[N],d[N],e[N],sa[N],height[N],n,b[N],m,dp[N][16];
    10 int cmp(int *r,int a,int b,int l)
    11 {
    12     return r[a]==r[b]&&r[a+l]==r[b+l];
    13 }
    14 void da()
    15 {
    16     int i,j,p,*x=c,*y=d,*t;
    17     memset(b,0,sizeof(b));
    18     for(i=0; i<n; i++)b[x[i]=a[i]]++;
    19     for(i=1; i<m; i++)b[i]+=b[i-1];
    20     for(i=n-1; i>=0; i--)sa[--b[x[i]]]=i;
    21     for(j=1,p=1; p<n; j*=2,m=p)
    22     {
    23         for(p=0,i=n-j; i<n; i++)y[p++]=i;
    24         for(i=0; i<n; i++)if(sa[i]>=j)y[p++]=sa[i]-j;
    25         for(i=0; i<n; i++)e[i]=x[y[i]];
    26         for(i=0; i<m; i++)b[i]=0;
    27         for(i=0; i<n; i++)b[e[i]]++;
    28         for(i=1; i<m; i++)b[i]+=b[i-1];
    29         for(i=n-1; i>=0; i--)sa[--b[e[i]]]=y[i];
    30         for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i<n; i++)
    31             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    32     }
    33 }
    34 void callheight()
    35 {
    36     int i,j,k=0;
    37     b[0]=0;
    38     for(i=1; i<n; i++)b[sa[i]]=i;
    39     for(i=0; i<n-1; height[b[i++]]=k)
    40         for(k?k--:0,j=sa[b[i]-1]; a[i+k]==a[j+k]; k++);
    41 }
    42 int fun(int i,int j)
    43 {
    44     i=b[i];
    45     j=b[j];
    46     if(i>j)swap(i,j);
    47     i++;
    48     int k=(int)(log(j-i+1.0)/log (2.0));
    49     return min(dp[i][k],dp[j-(1<<k)+1][k]);
    50 }
    51 void initrmq()
    52 {
    53     int i,j;
    54     memset(dp,0,sizeof(dp));
    55     for(i=0; i<=n; i++)
    56         dp[i][0]=height[i];
    57     for(j=1; (1<<j)<=n; j++)
    58         for(i=0; i+(1<<j)<=n; i++)
    59             dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
    60 }
    61 int main()
    62 {
    63     int t,i,j,r;
    64     scanf("%d",&t);
    65     for(r=0; r<t; r++)
    66     {
    67         scanf("%d",&n);
    68         for(i=0; i<n; i++)a[i]=getchar(),a[i]=getchar();
    69         a[n++]='';
    70         m=100;
    71         da();
    72         callheight();
    73         initrmq();
    74         int max=1;
    75         for(i=1; i<n/2; i++)
    76         {
    77             for(j=0; j+i<n; j+=i)
    78             {
    79                 int k=fun(j,j+i);
    80                 int kk=k/i+1;
    81                 int tt=i-k%i;
    82                 tt=j-tt;
    83                 if (tt>=0&&k%i!=0)
    84                     if(fun(tt,tt+i)>=k)
    85                         kk++;
    86                 if(max<kk)
    87                 {
    88                     max=kk;
    89                 }
    90             }
    91         }
    92         printf("%d
    ",max);
    93     }
    94 }
    View Code
  • 相关阅读:
    socket communication between a Java and/or C++ programs (现成的程序)
    java和asp.net之间web Service的创建和调用(2)
    linux下自动启动tomcat
    什么是CPU架构
    Eclipse for Linux on POWER 的安装和使用
    linux开机启动tomcat6
    揭开Socket编程的面纱
    认识错误 武胜
    MySqlCommand, MySqlParameter and "LIKE" with percent symbol zt 武胜
    设置zedgraph鼠标拖拽和局部放大属性 转 武胜
  • 原文地址:https://www.cnblogs.com/ERKE/p/3598397.html
Copyright © 2011-2022 走看看