• Longest Common Substring(后缀自动机)


    A string is finite sequence of characters over a non-empty finite set Σ.

    In this problem, Σ is the set of lowercase letters.

    Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string.

    Now your task is simple, for two given strings, find the length of the longest common substring of them.

    Here common substring means a substring of two or more strings.

    Input

    The input contains exactly two lines, each line consists of no more than 250000 lowercase letters, representing a string.

    Output

    The length of the longest common substring. If such string doesn't exist, print "0" instead.

    Example

    Input:
    alsdfkjfjkdsal
    fdjskalajfkdsla
    
    Output:
    3





    n四次方的暴力不解释 = =
    然后还有n方的dp
    然后就是sa和sam
    sa的复杂度是nlogn
    然后就是sam了,玄学的复杂,完全不知道如何证明,o(玄学)就对了
    
    
    
    
    
    
     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<map>
     5 #include<set>
     6 #include<queue>
     7 #include<algorithm>
     8 #include<cmath>
     9 #include<stack>
    10 #include<cstring>
    11 #define mem(a,b) memset(a,b,sizeof a)
    12 #define sc(a) scanf("%d",&(a))
    13 #define scc(a,b) scanf("%d %d",&(a),&(b))
    14 #define ll long long
    15 using namespace std;
    16 
    17 
    18 int kd[1000000];
    19 
    20 struct dd
    21 {
    22 
    23     int fa,len;
    24     int tr[29];
    25 
    26 }dian[1200000];
    27 int cnt[1200000];
    28 
    29 int last=1;int tot=1;
    30 inline void add(int c)
    31 {
    32    int p=last; int np=last=++tot;
    33    dian[np].len=dian[p].len+1;
    34 
    35    for(;p&&!dian[p].tr[c];p=dian[p].fa)dian[p].tr[c]=np;
    36    if(!p)dian[np].fa=1,cnt[1]++;
    37    else
    38    {
    39        int q=dian[p].tr[c];
    40        if(dian[q].len==dian[p].len+1)dian[np].fa=q,cnt[q]++;
    41        else
    42        {
    43            int nq=++tot;
    44            dian[nq]=dian[q];
    45            dian[nq].len=dian[p].len+1;
    46            dian[q].fa=dian[np].fa=nq;
    47            cnt[nq]+=2;
    48            for(;p&&dian[p].tr[c]==q;p=dian[p].fa)dian[p].tr[c]=nq;
    49 
    50        }
    51    }
    52 }
    53 int ans=0;
    54 void top()
    55 {
    56    int now=1,t=0;
    57    string s;cin>>s; int len = s.length();
    58    for(int i=0;i<len;i++)
    59    {
    60        int so=s[i]-'a';
    61        if(dian[now].tr[so])now=dian[now].tr[so],t++;
    62        else
    63        {
    64            while(now&&!dian[now].tr[so])now=dian[now].fa;
    65            if(!now)now=1,t=0;
    66            else{
    67 
    68             t=dian[now].len+1;
    69             //这里先对t赋值,因为这里是顺着fa向上走,到达的状态一定是两个串
    70             //的公共字串,然后多了s【i】,t+=1;
    71             now=dian[now].tr[so];
    72            }
    73        }
    74        ans=max(ans,t);
    75    }
    76    cout<<ans;
    77 }
    78 
    79 signed main()
    80 {
    81     string  s; string t;
    82     //ios::sync_with_stdio(0);
    83 //    cin.tie(0);
    84 
    85     cin>>t;
    86      s+=t;  int n=s.length();
    87      for(int i=0;i<n;i++)add(s[i]-'a');
    88     top();
    89 
    90 
    91 }

    
    
  • 相关阅读:
    URAL 1998 The old Padawan 二分
    URAL 1997 Those are not the droids you're looking for 二分图最大匹配
    URAL 1995 Illegal spices 贪心构造
    URAL 1993 This cheeseburger you don't need 模拟题
    URAL 1992 CVS
    URAL 1991 The battle near the swamp 水题
    Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力
    Codeforces Beta Round #7 D. Palindrome Degree hash
    Codeforces Beta Round #7 C. Line Exgcd
    Codeforces Beta Round #7 B. Memory Manager 模拟题
  • 原文地址:https://www.cnblogs.com/zhangbuang/p/10850224.html
Copyright © 2020-2023  润新知