标签:
Time Limit: 4000MS | Memory Limit: 131072K | |
Total Submissions: 26601 | Accepted: 10816 | |
Case Time Limit: 1000MS |
Description
Input
Output
Sample Input
yeshowmuchiloveyoumydearmotherreallyicannotbelieveit yeaphowmuchiloveyoumydearmother
Sample Output
27
思路:
将字符串s1,s2相连,中间加数字1,并在新的字符串末尾加0,求后缀数组。然后求最长的复合条件的答案就好了。
/* * Author: sweat123 * Created Time: 2016/7/9 19:39:27 * File Name: main.cpp */ #include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<string> #include<vector> #include<cstdio> #include<time.h> #include<cstring> #include<iostream> #include<algorithm> #define INF 1<<30 #define MOD 1000000007 #define ll long long #define lson l,m,rt<<1 #define key_value ch[ch[root][1]][0] #define rson m+1,r,rt<<1|1 #define pi acos(-1.0) using namespace std; const int MAXN = 200010; char s1[MAXN],s2[MAXN]; int n,r[MAXN],height[MAXN],Rank[MAXN],wa[MAXN],wb[MAXN],wc[MAXN]; int sa[MAXN]; void da(int *r,int *sa,int n,int m){ int *x = wa,*y = wb; for(int i = 0; i < m; i++)wc[i] = 0; for(int i = 0; i < n; i++)wc[x[i] = r[i]] ++; for(int i = 0; i < m; i++)wc[i] += wc[i-1]; for(int i = n - 1; i >= 0; i--)sa[--wc[x[i]]] = i; for(int p = 1,k = 1; p < n; k <<= 1, m = p){ p = 0; for(int i = n - k; i < n; i++)y[p++] = i; for(int i = 0; i < n; i++)if(sa[i] >= k)y[p++] = sa[i] - k; for(int i = 0; i < m; i++)wc[i] = 0; for(int i = 0; i < n; i++)wc[x[y[i]]] ++; for(int i = 0; i < m; i++)wc[i] += wc[i-1]; for(int i = n - 1; i >= 0; i--)sa[--wc[x[y[i]]]] = y[i]; swap(x,y); p = 1; x[sa[0]] = 0; for(int i = 1; i < n; i++){ x[sa[i]] = (y[sa[i]] == y[sa[i-1]] && y[sa[i]+k] == y[sa[i-1]+k])?p-1:p++; } } } void calheight(int *r,int *sa,int n){ for(int i = 1; i <= n; i++)Rank[sa[i]] = i; int j,k; k = 0; for(int i = 0; i < n; height[Rank[i++]] = k){ for(k?k--:0,j = sa[Rank[i] - 1]; r[i+k] == r[j+k]; k++); } } void solve(int len1,int len2){ int ans = 0,l,r; for(int i = 1; i <= n; i++){ if(height[i] > ans){ l = sa[i-1]; r = sa[i]; if(l + height[i] - 1 < len1 && r > len1)ans = max(ans,height[i]); if(r + height[i] - 1 < len1 && l > len1)ans = max(ans,height[i]); } } printf("%d\n",ans); } int main(){ while(~scanf("%s",s1)){ scanf("%s",s2); int len1 = strlen(s1); int len2 = strlen(s2); n = 0; for(int i = 0; i < len1; i++){ r[i] = s1[i]; } r[len1] = 1; for(int i = 0; i < len2; i++){ r[i + len1 + 1] = s2[i]; } n = len1 + len2 + 1; r[n] = 0; da(r,sa,n+1,128); calheight(r,sa,n); solve(len1,len2); } return 0; }
标签:
原文地址:http://www.cnblogs.com/sweat123/p/5656688.html