diff --git a/String_Algo/suffix_array.cpp b/String_Algo/suffix_array.cpp new file mode 100644 index 0000000..afdfc6d --- /dev/null +++ b/String_Algo/suffix_array.cpp @@ -0,0 +1,126 @@ +#include +using namespace std; +typedef long long int ll; +typedef unsigned long long int ull; +typedef long double ld; +#define MOD 1000000007 +#define INF 1000000000000000000 +#define endll "\n" +#define pb push_back +#define forn(i,n) for(i=0;i> +#define pll pair +#define vll vector +#define ff first +#define ss second +#define bs binary_search +#define lb lower_bound +#define ub upper_bound +#define test ll t;cin>>t; while(t--) +#define fast_io ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); + + vll SortCharacters(string& s) + { + vll order(s.length()); + ll count[27]={0},i; + for(i=0;i=0;i--) + { + ll x=s[i]-'A'+1; + count[x]-=1; + order[count[x]]=i; + } + return order; + } + + vll ComputeCharClasses(string& s, vll& order) + { + vll clss(s.length()); + ll i; + clss[order[0]]=0; + for(i=1;i=0;i--) + { + start=(order[i]-len+s.length())%s.length(); + cl=clss[start]; + count[cl]-=1; + newOrder[count[cl]]=start; + } + return newOrder; + } + + vll UpdateClasses(vll& newOrder,vll& clss,ll len) + { + ll n=newOrder.size(),i,cur,prev,midprev,mid; + vll newClass(n); + newClass[newOrder[0]]=0; + for(i=1;i>s; + ll i; + vll order=SortCharacters(s); + vll clss=ComputeCharClasses(s,order); + ll len=1; + while(len