Advertisement
Guest User

Untitled

a guest
Dec 8th, 2015
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define all(v) (v).begin(),(v).end()
  4. #define INF int(1e8)
  5. #define NINF int(-1e8)
  6. #define clr(a,v) memset(a,v,sizeof(a))
  7. #define ll long long
  8. #define ull unsigned long long
  9. #define ld long double
  10. #define eps 1e-8
  11. #define PI acos(-1)
  12. #define MOD (ll)(1e9 + 7)
  13. #define readFile freopen("in.txt","r",stdin)
  14. #define fastIO ios::sync_with_stdio(0)
  15.  
  16. using namespace std;
  17.  
  18. const int N = 200010;
  19. int sufArr[N], tmpSufArr[N], rank[N], tmpRank[N], lcp[N];
  20. int len;
  21. char text[N];
  22.  
  23. void radixSort(int k){
  24.     int freq[N] = {0}, mx = max(300,len);
  25.     for(int i = 0; i < len; i++) freq[i+k < len ? rank[i+k] : 0]++;
  26.     int acum = 0;
  27.     for(int i = 0; i < mx; i++){
  28.         int sh = freq[i]; freq[i] = acum;
  29.         acum += sh;
  30.     }
  31.     for(int i = 0; i < len; i++) tmpSufArr[freq[sufArr[i]+k < len ? rank[sufArr[i]+k] : 0 ]++] = sufArr[i];
  32.     for(int i = 0; i < len; i++) sufArr[i] = tmpSufArr[i];
  33. }
  34.  
  35. void buildSuffixArray(){
  36.     clr(sufArr,0); clr(tmpSufArr,0); clr(rank,0); clr(tmpRank,0);
  37.     for(int i = 0; i < len; i++) sufArr[i] = i, rank[i] = text[i];
  38.     for(int k = 1; k < len; k <<= 1){
  39.         radixSort(k);
  40.         radixSort(0);
  41.         int r = 0;
  42.         tmpRank[sufArr[0]] = r;
  43.         for(int i = 1; i < len; i++)
  44.             if(rank[sufArr[i]]==rank[sufArr[i-1]] && rank[sufArr[i]+k]==rank[sufArr[i-1]+k])
  45.                 tmpRank[sufArr[i]] = r;
  46.             else tmpRank[sufArr[i]] = ++r;
  47.         for(int i = 0; i < len; i++) rank[i] = tmpRank[i];
  48.         if(rank[sufArr[len-1]] == len-1) break;
  49.     }
  50. }
  51.  
  52. void buildLcp(){
  53.     clr(lcp,0);
  54.     int pos[N] = {0}, plcp[N] = {0}, l = 0;
  55.     pos[sufArr[0]] = -1;
  56.     for(int i = 1; i < len; i++) pos[sufArr[i]] = sufArr[i-1];
  57.     for(int i = 0; i < len; i++){
  58.         if(pos[i]==-1){
  59.             plcp[i] = 0;
  60.             continue;
  61.         }
  62.         while(text[i+l] == text[pos[i]+l]) l++;
  63.         plcp[i] = l;
  64.         l = max(l-1,0);
  65.     }
  66.     for(int i = 0; i < len; i++) lcp[i] = plcp[sufArr[i]];
  67. }
  68.  
  69. int main(){
  70.  
  71. #ifndef ONLINE_JUDGE
  72.     readFile;
  73. #endif
  74.  
  75.     char t1[N],t2[N];
  76.     while(scanf("%s",t1) != EOF){
  77.        
  78.         scanf("%s\n",t2);
  79.  
  80.         int l1 = strlen(t1), l2 = strlen(t2);
  81.  
  82.         for(int i = 0; i < l1; i++) text[i] = t1[i];
  83.         text[l1++] = '#';
  84.         for(int i = 0; i < l2; i++) text[i+l1] = t2[i];
  85.         len = strlen(text);
  86.         text[len++] = '$';
  87.  
  88.         buildSuffixArray();
  89.         buildLcp();
  90.  
  91.         int lcs = 0;
  92.         for(int i = 1; i < len; i++){
  93.             int ow1 = sufArr[i-1], ow2 = sufArr[i];
  94.             if(ow1>ow2) swap(ow1,ow2);
  95.             if(ow1<l1&&ow2>=l1&&lcp[i]<=(l1-ow1)) lcs = max(lcs,lcp[i]);
  96.         }
  97.         if(!lcs){
  98.             printf("No common sequence.\n\n");
  99.             continue;
  100.         }
  101.         for(int i = 1; i < len; i++){
  102.             if(lcp[i] == lcs){
  103.                 int ow1 = sufArr[i-1], ow2 = sufArr[i];
  104.                 if(ow1>ow2) swap(ow1,ow2);
  105.                 if(ow1<l1&&ow2>=l1&&lcp[i]<=(l1-ow1)){
  106.                     for(int j = sufArr[i]; j < sufArr[i]+lcs; j++) printf("%c",text[j]);
  107.                     printf("\n");
  108.                 }
  109.             }
  110.         }
  111.         printf("\n");
  112.        
  113.     }
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement