TAHMID37

longest common sub string

Oct 10th, 2021
993
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.15 KB | None | 0 0
  1. /*  TAHMID RAHMAN
  2.     DAMIAN FOREVER
  3.      MATH LOVER
  4.     NEVER GIVE UP
  5. */
  6. #include<bits/stdc++.h>
  7. using namespace std;
  8. #define pi acos(-1.0)
  9. #define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
  10. #define ll long long
  11. #define pb push_back
  12. #define fi first
  13. #define se second
  14. #define in insert
  15. #define mp make_pair
  16. #define GCD(a,b) __gcd(a,b);
  17. #define endl "\n"
  18. #define FRU freopen("out.txt","w",stdout)
  19. #define FRO freopen("in.txt","r",stdin)
  20. #define INFLL 9223372036854775807
  21. #define all(x) (x).begin(),(x).end()
  22. #define MAXN   100001
  23. #define ar array
  24. #define lb lower_bound
  25. #define ub upper_bound
  26. #define minpq priority_queue<ll, vector<ll>, greater<ll>>
  27. #define maxpq priority_queue<ll>
  28. const int mxN=2e5;
  29. const int MOD=1e9+7;
  30. template<typename ForwardIterator, typename T>
  31. ForwardIterator first_less_than (ForwardIterator first, ForwardIterator last, T value)
  32. {auto it = std::lower_bound (first, last, value);
  33. return (it == first ? last : --it);}
  34. bool sortbysec(const pair<ll,ll> &a,const pair<ll,ll> &b)
  35. {
  36.     return (a.second < b.second);
  37. }
  38. #define debugxx(v) {for(auto x:v){cout<<x.fi<<" "<<x.se<<endl;}cout<<endl;}
  39. #define debugx(v){for(auto y:v) {cout<<y<<" ";}cout<<endl;}
  40. #define debug(x) cout<<#x<<" ";_print(x); cout<<endl;
  41. typedef unsigned long long ull;
  42. typedef long double lld;
  43. void _print(ll t) {cout << t;}
  44. void _print(int t) {cout << t;}
  45. void _print(string t) {cout << t;}
  46. void _print(char t) {cout << t;}
  47. void _print(lld t) {cout << t;}
  48. void _print(double t) {cout << t;}
  49. void _print(ull t) {cout << t;}
  50.  
  51. template <class T, class V> void _print(pair <T, V> p);
  52. template <class T> void _print(vector <T> v);
  53. template <class T> void _print(set <T> v);
  54. template <class T, class V> void _print(map <T, V> v);
  55. template <class T> void _print(multiset <T> v);
  56. template <class T, class V> void _print(pair <T, V> p) {cout << "{"; _print(p.fi); cout << ","; _print(p.se); cout << "}";}
  57. template <class T> void _print(vector <T> v) {cout << "[ "; for (T i : v) {_print(i); cout << " ";} cout << "]";}
  58. template <class T> void _print(set <T> v) {cout << "[ "; for (T i : v) {_print(i); cout << " ";} cout << "]";}
  59. template <class T> void _print(multiset <T> v) {cout << "[ "; for (T i : v) {_print(i); cout << " ";} cout << "]";}
  60. template <class T, class V> void _print(map <T, V> v) {cout << "[ "; for (auto i : v) {_print(i); cout << " ";} cout << "]";}
  61. //Don't hesitate to ask me if you don't understand my code.......Happy coding,Tahmid...;
  62.  
  63. vector<ll> SortCyclicShifts(string s){
  64.     int n=s.size();
  65.     const int alphabet=256;
  66.     vector<ll>Start(n),Freq(max(alphabet,n),0),EClass(n);
  67.     for(int i=0;i<n;i++) Freq[s[i]]++;
  68.     for(int i=1;i<alphabet;i++) Freq[i]+=Freq[i-1];
  69.     for(int i=0;i<n;i++) Start[--Freq[s[i]]]=i;
  70.     int Class=1;
  71.     EClass[Start[0]]=0;
  72.     for(int i=1;i<n;i++){
  73.         if(s[Start[i]]!=s[Start[i-1]]) Class++;
  74.         EClass[Start[i]]=Class-1;
  75.     }
  76.     for(int p=0;(1<<p)<n;p++){
  77.         vector<ll> STemp(n),ECTemp(n);
  78.         for(int i=0;i<n;i++){
  79.             STemp[i]=Start[i]-(1<<p);
  80.             if(STemp[i]<0) STemp[i]+=n;
  81.         }
  82.         fill(Freq.begin(),Freq.begin()+Class,0);
  83.         for(int i=0;i<n;i++) Freq[EClass[STemp[i]]]++;
  84.         for(int i=1;i<Class;i++) Freq[i]+=Freq[i-1];
  85.         for(int i=n-1;i>=0;i--){
  86.             Start[--Freq[EClass[STemp[i]]]]=STemp[i];
  87.         }
  88.         ECTemp[Start[0]]=0;
  89.         Class=1;
  90.         for(int i=1;i<n;i++){
  91.             pair<ll,ll>prev,curr;
  92.             prev={EClass[Start[i-1]],EClass[(Start[i-1]+(1<<p))%n]};
  93.             curr={EClass[Start[i]],EClass[(Start[i]+(1<<p))%n]};
  94.             if(curr!=prev) Class++;
  95.             ECTemp[Start[i]]=Class-1;
  96.         }
  97.         for(int i=0;i<n;i++){
  98.             EClass[Start[i]]=ECTemp[Start[i]];
  99.         }
  100.     }
  101.     return Start;
  102. }
  103. vector<ll> BuildSuffixArray(string s){
  104.     s+='$';
  105.     vector<ll>ret=SortCyclicShifts(s);
  106.     ret.erase(ret.begin());
  107.     return ret;
  108. }
  109.  
  110.  
  111.  vector<ll> lcp(vector<ll>&sa,string &s)
  112. {
  113.     ll n=sa.size();
  114.     vector<ll>ranks(n);
  115.     ll h=0,i=0;
  116.     s+='$';
  117.     vector<ll>l(n,0);
  118.     for(i=0;i<n;i++)
  119.        ranks[sa[i]]=i;
  120.  
  121.  
  122.     for(i=0;i<n;i++)
  123.     {
  124.         if(ranks[i]>0)
  125.         {
  126.             ll k=sa[ranks[i]-1];
  127.             while(s[i+h]==s[k+h]){
  128.                 h++;
  129.             }
  130.  
  131.             l[ranks[i]]=h;
  132.  
  133.             if(h)
  134.                h--;
  135.         }
  136.     }
  137.  
  138.     return l;
  139.  
  140. }
  141.  
  142. ll lcp(ll a,ll b,vector<ll>&v)
  143. {
  144.     ll i=a+1;
  145.     ll ans=v[i];
  146.  
  147.     for(i=a+1;i<=b;i++)
  148.     {
  149.         ans=min(ans,v[i]);
  150.     }
  151.  
  152.     return ans;
  153. }
  154.  
  155. int main()
  156. {
  157.     fastio;
  158.     ll t;
  159.     //t=1;
  160.     cin>>t;
  161.     while(t--)
  162.     {
  163.         ll n,i,j,k;
  164.         cin>>n;
  165.  
  166.         map<ll,ll>m;
  167.         string s1,s;
  168.         for(i=0;i<n;i++)
  169.         {
  170.             cin>>s;
  171.             s1+=s;
  172.             s1+='0'+i;
  173.         }
  174.  
  175.  
  176.  
  177.         s1.pop_back();
  178.  
  179.         if(n==1)
  180.         {
  181.             cout<<s1<<endl;
  182.             continue;
  183.         }
  184.  
  185.         ll temp=0;
  186.  
  187.         for(i=0;i<s1.size();i++)
  188.         {
  189.             if(s1[i]>='a'&&s[i]<='z')
  190.             {
  191.                 m[i]=temp;
  192.             }
  193.             else
  194.             {
  195.                 temp++;
  196.                 m[i]=temp;
  197.             }
  198.         }
  199.  
  200.         vector<ll>sa=BuildSuffixArray(s1);
  201.         vector<ll>lc=lcp(sa,s1);
  202.  
  203.         ll l=0,r=1;
  204.         ll ans=1;
  205.  
  206.        // debug(n);
  207.         //debug(sa);
  208.  
  209.         multiset<ll>st;
  210.  
  211.         st.in(m[sa[0]]);
  212.         st.in(m[sa[1]]);
  213.  
  214.         while(r<sa.size())
  215.         {
  216.             set<ll>y;
  217.  
  218.             for(auto x:st )
  219.             {
  220.                 y.in(x);
  221.             }
  222.  
  223.             if(y.size()==n)
  224.             {
  225.                 ll val=lcp(l,r,lc);
  226.                 ans=max(ans,val);
  227.                 st.erase(m[sa[l]]);
  228.                 l++;
  229.  
  230.                 if(l<sa.size())
  231.                     st.in(m[sa[l]]);
  232.                 else
  233.                     break;
  234.             }
  235.             else
  236.             {
  237.                 r++;
  238.  
  239.                 if(r<sa.size())
  240.                     st.in(m[sa[r]]);
  241.             }
  242.  
  243.         }
  244.  
  245.  
  246.  
  247.  
  248.         cout<<ans<<endl;
  249.  
  250.  
  251.     }
  252.  
  253. }
  254.  
  255.  
  256.  
  257.  
Advertisement
Add Comment
Please, Sign In to add comment