Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define all(v) (v).begin(),(v).end()
- #define INF int(1e8)
- #define NINF int(-1e8)
- #define clr(a,v) memset(a,v,sizeof(a))
- #define ll long long
- #define ull unsigned long long
- #define ld long double
- #define eps 1e-8
- #define PI acos(-1)
- #define MOD (ll)(1e9 + 7)
- #define readFile freopen("in.txt","r",stdin)
- #define fastIO ios::sync_with_stdio(0)
- using namespace std;
- const int N = 200010;
- int sufArr[N], tmpSufArr[N], rank[N], tmpRank[N], lcp[N];
- int len;
- char text[N];
- void radixSort(int k){
- int freq[N] = {0}, mx = max(300,len);
- for(int i = 0; i < len; i++) freq[i+k < len ? rank[i+k] : 0]++;
- int acum = 0;
- for(int i = 0; i < mx; i++){
- int sh = freq[i]; freq[i] = acum;
- acum += sh;
- }
- for(int i = 0; i < len; i++) tmpSufArr[freq[sufArr[i]+k < len ? rank[sufArr[i]+k] : 0 ]++] = sufArr[i];
- for(int i = 0; i < len; i++) sufArr[i] = tmpSufArr[i];
- }
- void buildSuffixArray(){
- clr(sufArr,0); clr(tmpSufArr,0); clr(rank,0); clr(tmpRank,0);
- for(int i = 0; i < len; i++) sufArr[i] = i, rank[i] = text[i];
- for(int k = 1; k < len; k <<= 1){
- radixSort(k);
- radixSort(0);
- int r = 0;
- tmpRank[sufArr[0]] = r;
- for(int i = 1; i < len; i++)
- if(rank[sufArr[i]]==rank[sufArr[i-1]] && rank[sufArr[i]+k]==rank[sufArr[i-1]+k])
- tmpRank[sufArr[i]] = r;
- else tmpRank[sufArr[i]] = ++r;
- for(int i = 0; i < len; i++) rank[i] = tmpRank[i];
- if(rank[sufArr[len-1]] == len-1) break;
- }
- }
- void buildLcp(){
- clr(lcp,0);
- int pos[N] = {0}, plcp[N] = {0}, l = 0;
- pos[sufArr[0]] = -1;
- for(int i = 1; i < len; i++) pos[sufArr[i]] = sufArr[i-1];
- for(int i = 0; i < len; i++){
- if(pos[i]==-1){
- plcp[i] = 0;
- continue;
- }
- while(text[i+l] == text[pos[i]+l]) l++;
- plcp[i] = l;
- l = max(l-1,0);
- }
- for(int i = 0; i < len; i++) lcp[i] = plcp[sufArr[i]];
- }
- int main(){
- #ifndef ONLINE_JUDGE
- readFile;
- #endif
- char t1[N],t2[N];
- while(scanf("%s",t1) != EOF){
- scanf("%s\n",t2);
- int l1 = strlen(t1), l2 = strlen(t2);
- for(int i = 0; i < l1; i++) text[i] = t1[i];
- text[l1++] = '#';
- for(int i = 0; i < l2; i++) text[i+l1] = t2[i];
- len = strlen(text);
- text[len++] = '$';
- buildSuffixArray();
- buildLcp();
- int lcs = 0;
- for(int i = 1; i < len; i++){
- int ow1 = sufArr[i-1], ow2 = sufArr[i];
- if(ow1>ow2) swap(ow1,ow2);
- if(ow1<l1&&ow2>=l1&&lcp[i]<=(l1-ow1)) lcs = max(lcs,lcp[i]);
- }
- if(!lcs){
- printf("No common sequence.\n\n");
- continue;
- }
- for(int i = 1; i < len; i++){
- if(lcp[i] == lcs){
- int ow1 = sufArr[i-1], ow2 = sufArr[i];
- if(ow1>ow2) swap(ow1,ow2);
- if(ow1<l1&&ow2>=l1&&lcp[i]<=(l1-ow1)){
- for(int j = sufArr[i]; j < sufArr[i]+lcs; j++) printf("%c",text[j]);
- printf("\n");
- }
- }
- }
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement