标签:des style blog http color java os io for
yeshowmuchiloveyoumydearmotherreallyicannotbelieveit yeaphowmuchiloveyoumydearmother
27
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #include <stack> 13 #define LL long long 14 #define pii pair<int,int> 15 #define INF 0x3f3f3f3f 16 using namespace std; 17 const int maxn = 210000; 18 int n,k,_rank[maxn],sa[maxn],lcp[maxn]; 19 char str[maxn]; 20 bool cmp_sa(int i,int j) { 21 if(_rank[i] != _rank[j]) return _rank[i] < _rank[j]; 22 int ri = i + k < n ? _rank[i+k]:0; 23 int rj = j + k < n ? _rank[j+k]:0; 24 return ri < rj; 25 } 26 void construct_sa(char *s) { 27 n = strlen(s); 28 memset(sa,0,sizeof(sa)); 29 for(int i = 0; i < n; i++) { 30 sa[i] = i; 31 _rank[i] = s[i]; 32 } 33 for(k = 1; k < n; k <<= 1) { 34 sort(sa,sa+n,cmp_sa); 35 lcp[sa[0]] = 0; 36 for(int i = 1; i < n; i++) 37 lcp[sa[i]] = lcp[sa[i-1]] + cmp_sa(sa[i-1],sa[i]); 38 for(int i = 0; i < n; i++) 39 _rank[i] = lcp[i]; 40 } 41 } 42 void construct_lcp(char *s) { 43 memset(lcp,0,sizeof(lcp)); 44 for(int i = 0,h = 0; i < n; i++) { 45 if(h) h--; 46 for(int j = sa[_rank[i]+1]; i+h < n && j + h < n && s[i+h] == s[j+h]; h++); 47 lcp[_rank[i]+1] = h; 48 } 49 } 50 int main() { 51 int len,ans; 52 gets(str); 53 len = strlen(str); 54 str[len] = ‘+‘; 55 gets(str+len+1); 56 construct_sa(str); 57 construct_lcp(str); 58 ans = 0; 59 for(int i = 1; i < n; i++) 60 if((sa[i] < len) != (sa[i-1] < len)) ans = max(ans,lcp[i]); 61 printf("%d\n",ans); 62 return 0; 63 }
标签:des style blog http color java os io for
原文地址:http://www.cnblogs.com/crackpotisback/p/3932490.html