1. 程式人生 > >Longest Common Substring(後綴自動機)

Longest Common Substring(後綴自動機)

ont bsp imp them sin dsa dsl exist sts

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 }



Longest Common Substring(後綴自動機)