Pages

Hacker Rank Test-33







                                                            TEST -33


LINK:

https://www.hackerrank.com/ececodetest33


1]

Gridland Provinces






#include <stdio.h>
#include <stdlib.h>
#define MOD1 1000000007
#define MOD2 1000000009
#define HASH_SIZE 123455
typedef struct _node{
  int x;
  int y;
  struct _node *next;
} node;
void solve(int i,int j);
void insert(int x,int y);
void freehash();
long long modInverse(long long a,long long mod);
char a[2][601];
int hash_count,N;
long long tr1[1200],tl1[1200],br1[1200],bl1[1200],dr1[1200],dl1[1200],ur1[1200],ul1[1200],mod1[1201],inmod1[1201];
long long tr2[1200],tl2[1200],br2[1200],bl2[1200],dr2[1200],dl2[1200],ur2[1200],ul2[1200],mod2[1201],inmod2[1201];
node *hash[HASH_SIZE]={0};

int main(){
  int T,i,j;
  long long t1,t2;
  scanf("%d",&T);
  while(T--){
    hash_count=0;
    scanf("%d%s%s",&N,&a[0][0],&a[1][0]);
    for(i=0,t1=t2=1;i<N;i++,t1=t1*26%MOD1,t2=t2*26%MOD2)
      if(i){
        tl1[i]=((a[0][i]-'a')*t1+tl1[i-1])%MOD1;
        bl1[i]=((a[1][i]-'a')*t1+bl1[i-1])%MOD1;
        tl2[i]=((a[0][i]-'a')*t2+tl2[i-1])%MOD2;
        bl2[i]=((a[1][i]-'a')*t2+bl2[i-1])%MOD2;
      }
      else{
        tl1[i]=a[0][i]-'a';
        bl1[i]=a[1][i]-'a';
        tl2[i]=a[0][i]-'a';
        bl2[i]=a[1][i]-'a';
      }
    for(i=N-1;i>=0;i--,t1=t1*26%MOD1,t2=t2*26%MOD2){
      tl1[2*N-i-1]=((a[1][i]-'a')*t1+tl1[2*N-i-2])%MOD1;
      bl1[2*N-i-1]=((a[0][i]-'a')*t1+bl1[2*N-i-2])%MOD1;
      tl2[2*N-i-1]=((a[1][i]-'a')*t2+tl2[2*N-i-2])%MOD2;
      bl2[2*N-i-1]=((a[0][i]-'a')*t2+bl2[2*N-i-2])%MOD2;
    }
    for(i=N-1,t1=t2=1;i>=0;i--,t1=t1*26%MOD1,t2=t2*26%MOD2)
      if(i!=N-1){
        tr1[N-i-1]=((a[0][i]-'a')*t1+tr1[N-i-2])%MOD1;
        br1[N-i-1]=((a[1][i]-'a')*t1+br1[N-i-2])%MOD1;
        tr2[N-i-1]=((a[0][i]-'a')*t2+tr2[N-i-2])%MOD2;
        br2[N-i-1]=((a[1][i]-'a')*t2+br2[N-i-2])%MOD2;
      }
      else{
        tr1[N-i-1]=a[0][i]-'a';
        br1[N-i-1]=a[1][i]-'a';
        tr2[N-i-1]=a[0][i]-'a';
        br2[N-i-1]=a[1][i]-'a';
      }
    for(i=0;i<N;i++,t1=t1*26%MOD1,t2=t2*26%MOD2){
      tr1[i+N]=((a[1][i]-'a')*t1+tr1[i+N-1])%MOD1;
      br1[i+N]=((a[0][i]-'a')*t1+br1[i+N-1])%MOD1;
      tr2[i+N]=((a[1][i]-'a')*t2+tr2[i+N-1])%MOD2;
      br2[i+N]=((a[0][i]-'a')*t2+br2[i+N-1])%MOD2;
    }
    for(i=0,t1=t2=1;i<N;i++){
      if(i%2){
        ul1[2*i]=((a[0][i]-'a')*t1+ul1[2*i-1])%MOD1;
        dl1[2*i]=((a[1][i]-'a')*t1+dl1[2*i-1])%MOD1;
        ul2[2*i]=((a[0][i]-'a')*t2+ul2[2*i-1])%MOD2;
        dl2[2*i]=((a[1][i]-'a')*t2+dl2[2*i-1])%MOD2;
      }
      else
        if(!i){
          ul1[2*i]=a[1][i]-'a';
          dl1[2*i]=a[0][i]-'a';
          ul2[2*i]=a[1][i]-'a';
          dl2[2*i]=a[0][i]-'a';
        }
        else{
          ul1[2*i]=((a[1][i]-'a')*t1+ul1[2*i-1])%MOD1;
          dl1[2*i]=((a[0][i]-'a')*t1+dl1[2*i-1])%MOD1;
          ul2[2*i]=((a[1][i]-'a')*t2+ul2[2*i-1])%MOD2;
          dl2[2*i]=((a[0][i]-'a')*t2+dl2[2*i-1])%MOD2;
        }
      t1=t1*26%MOD1;
      t2=t2*26%MOD2;
      if(i%2){
        ul1[2*i+1]=((a[1][i]-'a')*t1+ul1[2*i])%MOD1;
        dl1[2*i+1]=((a[0][i]-'a')*t1+dl1[2*i])%MOD1;
        ul2[2*i+1]=((a[1][i]-'a')*t2+ul2[2*i])%MOD2;
        dl2[2*i+1]=((a[0][i]-'a')*t2+dl2[2*i])%MOD2;
      }
      else{
        ul1[2*i+1]=((a[0][i]-'a')*t1+ul1[2*i])%MOD1;
        dl1[2*i+1]=((a[1][i]-'a')*t1+dl1[2*i])%MOD1;
        ul2[2*i+1]=((a[0][i]-'a')*t2+ul2[2*i])%MOD2;
        dl2[2*i+1]=((a[1][i]-'a')*t2+dl2[2*i])%MOD2;
      }
      t1=t1*26%MOD1;
      t2=t2*26%MOD2;
    }
    for(i=N-1,t1=t2=1;i>=0;i--)
      if(i==N-1){
        ur1[2*(N-1-i)]=a[1][i]-'a';
        dr1[2*(N-1-i)]=a[0][i]-'a';
        ur2[2*(N-1-i)]=a[1][i]-'a';
        dr2[2*(N-1-i)]=a[0][i]-'a';
        t1=t1*26%MOD1;
        t2=t2*26%MOD2;
        ur1[2*(N-1-i)+1]=((a[0][i]-'a')*t1+ur1[2*(N-1-i)])%MOD1;
        dr1[2*(N-1-i)+1]=((a[1][i]-'a')*t1+dr1[2*(N-1-i)])%MOD1;
        ur2[2*(N-1-i)+1]=((a[0][i]-'a')*t2+ur2[2*(N-1-i)])%MOD2;
        dr2[2*(N-1-i)+1]=((a[1][i]-'a')*t2+dr2[2*(N-1-i)])%MOD2;
        t1=t1*26%MOD1;
        t2=t2*26%MOD2;
      }
      else{
        if((N-i)%2==0){
          ur1[2*(N-1-i)]=((a[0][i]-'a')*t1+ur1[2*(N-1-i)-1])%MOD1;
          dr1[2*(N-1-i)]=((a[1][i]-'a')*t1+dr1[2*(N-1-i)-1])%MOD1;
          ur2[2*(N-1-i)]=((a[0][i]-'a')*t2+ur2[2*(N-1-i)-1])%MOD2;
          dr2[2*(N-1-i)]=((a[1][i]-'a')*t2+dr2[2*(N-1-i)-1])%MOD2;
        }
        else{
          ur1[2*(N-1-i)]=((a[1][i]-'a')*t1+ur1[2*(N-1-i)-1])%MOD1;
          dr1[2*(N-1-i)]=((a[0][i]-'a')*t1+dr1[2*(N-1-i)-1])%MOD1;
          ur2[2*(N-1-i)]=((a[1][i]-'a')*t2+ur2[2*(N-1-i)-1])%MOD2;
          dr2[2*(N-1-i)]=((a[0][i]-'a')*t2+dr2[2*(N-1-i)-1])%MOD2;
        }
        t1=t1*26%MOD1;
        t2=t2*26%MOD2;
        if((N-i)%2==0){
          ur1[2*(N-1-i)+1]=((a[1][i]-'a')*t1+ur1[2*(N-1-i)])%MOD1;
          dr1[2*(N-1-i)+1]=((a[0][i]-'a')*t1+dr1[2*(N-1-i)])%MOD1;
          ur2[2*(N-1-i)+1]=((a[1][i]-'a')*t2+ur2[2*(N-1-i)])%MOD2;
          dr2[2*(N-1-i)+1]=((a[0][i]-'a')*t2+dr2[2*(N-1-i)])%MOD2;
        }
        else{
          ur1[2*(N-1-i)+1]=((a[0][i]-'a')*t1+ur1[2*(N-1-i)])%MOD1;
          dr1[2*(N-1-i)+1]=((a[1][i]-'a')*t1+dr1[2*(N-1-i)])%MOD1;
          ur2[2*(N-1-i)+1]=((a[0][i]-'a')*t2+ur2[2*(N-1-i)])%MOD2;
          dr2[2*(N-1-i)+1]=((a[1][i]-'a')*t2+dr2[2*(N-1-i)])%MOD2;
        }
        t1=t1*26%MOD1;
        t2=t2*26%MOD2;
      }
    for(i=0;i<=2*N;i++)
      if(i){
        mod1[i]=mod1[i-1]*26%MOD1;
        inmod1[i]=modInverse(mod1[i],MOD1);
        mod2[i]=mod2[i-1]*26%MOD2;
        inmod2[i]=modInverse(mod2[i],MOD2);
      }
      else
        mod1[i]=inmod1[i]=mod2[i]=inmod2[i]=1;
    for(i=0;i<=N;i++)
      for(j=i;j<=N;j++)
        solve(i,j);
    printf("%d\n",hash_count);
    freehash();
  }
  return 0;
}
void solve(int i,int j){
  long long t1,t2,t3,t4,t5,t6,t7,t8,t9;
  long long tt1,tt2,tt3,tt4,tt5,tt6,tt7,tt8,tt9;
  t1=tr1[N+i-1];
  t2=br1[N+i-1];
  if(i!=N){
    t1=(t1-tr1[N-i-1]+MOD1)%MOD1;
    t2=(t2-br1[N-i-1]+MOD1)%MOD1;
  }
  t1=t1*inmod1[N-i]%MOD1;
  t2=t2*inmod1[N-i]%MOD1;
  t3=tl1[2*N-j-1];
  t4=bl1[2*N-j-1];
  if(j){
    t3=(t3-tl1[j-1]+MOD1)%MOD1;
    t4=(t4-bl1[j-1]+MOD1)%MOD1;
  }
  t3=t3*inmod1[j]%MOD1;
  t4=t4*inmod1[j]%MOD1;
  if(!j)
    t5=t6=0;
  else{
    t5=ul1[2*j-1];
    t6=dl1[2*j-1];
    if(i){
      t5=(t5-ul1[2*i-1]+MOD1)%MOD1;
      t6=(t6-dl1[2*i-1]+MOD1)%MOD1;
    }
  }
  if(i==N)
    t7=t8=0;
  else{
    t7=ur1[2*(N-i)-1];
    t8=dr1[2*(N-i)-1];
    if(j!=N){
      t7=(t7-ur1[2*(N-j)-1]+MOD1)%MOD1;
      t8=(t8-dr1[2*(N-j)-1]+MOD1)%MOD1;
    }
  }
  tt1=tr2[N+i-1];
  tt2=br2[N+i-1];
  if(i!=N){
    tt1=(tt1-tr2[N-i-1]+MOD2)%MOD2;
    tt2=(tt2-br2[N-i-1]+MOD2)%MOD2;
  }
  tt1=tt1*inmod2[N-i]%MOD2;
  tt2=tt2*inmod2[N-i]%MOD2;
  tt3=tl2[2*N-j-1];
  tt4=bl2[2*N-j-1];
  if(j){
    tt3=(tt3-tl2[j-1]+MOD2)%MOD2;
    tt4=(tt4-bl2[j-1]+MOD2)%MOD2;
  }
  tt3=tt3*inmod2[j]%MOD2;
  tt4=tt4*inmod2[j]%MOD2;
  if(!j)
    tt5=tt6=0;
  else{
    tt5=ul2[2*j-1];
    tt6=dl2[2*j-1];
    if(i){
      tt5=(tt5-ul2[2*i-1]+MOD2)%MOD2;
      tt6=(tt6-dl2[2*i-1]+MOD2)%MOD2;
    }
  }
  if(i==N)
    tt7=tt8=0;
  else{
    tt7=ur2[2*(N-i)-1];
    tt8=dr2[2*(N-i)-1];
    if(j!=N){
      tt7=(tt7-ur2[2*(N-j)-1]+MOD2)%MOD2;
      tt8=(tt8-dr2[2*(N-j)-1]+MOD2)%MOD2;
    }
  }
  t9=t1;
  if(i%2)
    t9+=t6;
  else
    t9+=t5;
  if((j-i)%2)
    t9+=t3*mod1[j*2]%MOD1;
  else
    t9+=t4*mod1[j*2]%MOD1;
  t9%=MOD1;
  tt9=tt1;
  if(i%2)
    tt9+=tt6;
  else
    tt9+=tt5;
  if((j-i)%2)
    tt9+=tt3*mod2[j*2]%MOD2;
  else
    tt9+=tt4*mod2[j*2]%MOD2;
  tt9%=MOD2;
  insert(t9,tt9);
  t9=t2;
  if(i%2)
    t9+=t5;
  else
    t9+=t6;
  if((j-i)%2)
    t9+=t4*mod1[j*2]%MOD1;
  else
    t9+=t3*mod1[j*2]%MOD1;
  t9%=MOD1;
  tt9=tt2;
  if(i%2)
    tt9+=tt5;
  else
    tt9+=tt6;
  if((j-i)%2)
    tt9+=tt4*mod2[j*2]%MOD2;
  else
    tt9+=tt3*mod2[j*2]%MOD2;
  tt9%=MOD2;
  insert(t9,tt9);
  t9=t3;
  if((N-j)%2)
    t9+=t8;
  else
    t9+=t7;
  if((j-i)%2)
    t9+=t1*mod1[(N-i)*2]%MOD1;
  else
    t9+=t2*mod1[(N-i)*2]%MOD1;
  t9%=MOD1;
  tt9=tt3;
  if((N-j)%2)
    tt9+=tt8;
  else
    tt9+=tt7;
  if((j-i)%2)
    tt9+=tt1*mod2[(N-i)*2]%MOD2;
  else
    tt9+=tt2*mod2[(N-i)*2]%MOD2;
  tt9%=MOD2;
  insert(t9,tt9);
  t9=t4;
  if((N-j)%2)
    t9+=t7;
  else
    t9+=t8;
  if((j-i)%2)
    t9+=t2*mod1[(N-i)*2]%MOD1;
  else
    t9+=t1*mod1[(N-i)*2]%MOD1;
  t9%=MOD1;
  tt9=tt4;
  if((N-j)%2)
    tt9+=tt7;
  else
    tt9+=tt8;
  if((j-i)%2)
    tt9+=tt2*mod2[(N-i)*2]%MOD2;
  else
    tt9+=tt1*mod2[(N-i)*2]%MOD2;
  tt9%=MOD2;
  insert(t9,tt9);
  return;
}
void insert(int x,int y){
  int bucket=(x+y)%HASH_SIZE;
  node *t=hash[bucket];
  while(t){
    if(t->x==x && t->y==y)
      return;
    t=t->next;
  }
  t=(node*)malloc(sizeof(node));
  t->x=x;
  t->y=y;
  t->next=hash[bucket];
  hash[bucket]=t;
  hash_count++;
  return;
}
void freehash(){
  int i;
  node *t,*p;
  for(i=0;i<HASH_SIZE;i++){
    t=hash[i];
    while(t){
      p=t->next;
      free(t);
      t=p;
    }
    hash[i]=NULL;
  }
  return;
}
long long modInverse(long long a,long long mod){
 long long b0 = mod, t, q;
 long long x0 = 0, x1 = 1;
 while (a > 1) {
  q = a / mod;
  t = mod; mod = a % mod; a = t;
  t = x0; x0 = x1 - q * x0; x1 = t;
 }
 if (x1 < 0) x1 += b0;
 return x1;
}




2]

Ashton and String







#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define N 100001
void merge(int*a,int*left,int*right,int left_size, int right_size);
void sort_a(int*a,int size);
void suffixSort(int n);
void LCP(int n);
char str[N]; //input
int rank[N], pos[N], lcp[N]; //output
int cnt[N], next[N]; //internal
int bh[N], b2h[N];

int main(){
  char cc;
  int T,n,i;
  long long K,c,t,x,tt;
  double xx;
  scanf("%d",&T);
  while(T--){
    scanf("%s%lld",str,&K);
    n=strlen(str);
    suffixSort(n);
    LCP(n);
    c=0;
    for(i=0;i<n;i++){
      tt=c;
      c+=(lcp[i]+1+n-pos[i])*(long long)(n-pos[i]-lcp[i])/2;
      if(K<=c){
        xx=(-1+sqrt(4*(2*(K-tt)+lcp[i]+lcp[i]*(long long)lcp[i])))/2;
        x=(long long)xx;
        t=K-tt-(lcp[i]+1+x)*(x-lcp[i])/2;
        if(!t)
          cc=str[pos[i]+x-1];
        else
          cc=str[pos[i]+t-1];
        break;
      }
    }
    printf("%c\n",cc);
  }
  return 0;
}
void merge(int*a,int*left,int*right,int left_size, int right_size){
    int i = 0, j = 0;
    while (i < left_size|| j < right_size) {
        if (i == left_size) {
            a[i+j] = right[j];
            j++;
        } else if (j == right_size) {
            a[i+j] = left[i];
            i++;
        } else if (str[left[i]] <= str[right[j]]) {
            a[i+j] = left[i];
            i++;           
        } else {
            a[i+j] = right[j];
            j++;
        }
    }
    return;
}
void sort_a(int*a,int size){
  if (size < 2)
    return;
  int m = (size+1)/2,i;
  int *left,*right;
  left=(int*)malloc(m*sizeof(int));
  right=(int*)malloc((size-m)*sizeof(int));
  for(i=0;i<m;i++)
    left[i]=a[i];
  for(i=0;i<size-m;i++)
    right[i]=a[i+m];
  sort_a(left,m);
  sort_a(right,size-m);
  merge(a,left,right,m,size-m);
  free(left);
  free(right);
  return;
}

void suffixSort(int n){
  //sort suffixes according to their first characters
  int h,i,j,k;
  for (i=0; i<n; ++i){
    pos[i] = i;
  }
  sort_a(pos, n);
  //{pos contains the list of suffixes sorted by their first character}

  for (i=0; i<n; ++i){
    bh[i] = i == 0 || str[pos[i]] != str[pos[i-1]];
    b2h[i] = 0;
  }

  for (h = 1; h < n; h <<= 1){
    //{bh[i] == false if the first h characters of pos[i-1] == the first h characters of pos[i]}
    int buckets = 0;
    for (i=0; i < n; i = j){
      j = i + 1;
      while (j < n && !bh[j]) j++;
      next[i] = j;
      buckets++;
    }
    if (buckets == n) break; // We are done! Lucky bastards!
    //{suffixes are separted in buckets containing strings starting with the same h characters}

    for (i = 0; i < n; i = next[i]){
      cnt[i] = 0;
      for (j = i; j < next[i]; ++j){
        rank[pos[j]] = i;
      }
    }

    cnt[rank[n - h]]++;
    b2h[rank[n - h]] = 1;
    for (i = 0; i < n; i = next[i]){
      for (j = i; j < next[i]; ++j){
        int s = pos[j] - h;
        if (s >= 0){
          int head = rank[s];
          rank[s] = head + cnt[head]++;
          b2h[rank[s]] = 1;
        }
      }
      for (j = i; j < next[i]; ++j){
        int s = pos[j] - h;
        if (s >= 0 && b2h[rank[s]]){
          for (k = rank[s]+1; !bh[k] && b2h[k]; k++) b2h[k] = 0;
        }
      }
    }
    for (i=0; i<n; ++i){
      pos[rank[i]] = i;
      bh[i] |= b2h[i];
    }
  }
  for (i=0; i<n; ++i){
    rank[pos[i]] = i;
  }
}
// End of suffix array algorithm

void LCP(int n){
  int l=0,i,j,k;
  for(i=0;i<n;i++){
    k=rank[i];
    if(!k)
      continue;
    j=pos[k-1];
    while(str[i+l]==str[j+l])
      l++;
    lcp[k]=l;
    if(l>0)
      l--;
  }
  lcp[0]=0;
  return;
}



  c++

3]

Two Strings Game






#include<cstdio>
#include<map>
#include<set>
#include<bitset>
#include<string>
#include<cassert>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long unsigned ull;
const ull inf = 1ull<<60;
const int N = 1203333,M=28;
struct state{
int len,link;
int next[26];
} sa[N];
int sg[N];
ull cnt[N][M],tot[N];
static int pmem=1;
int new_root(){
sa[pmem].len = 0;
sa[pmem].link = -1;
return pmem++;
}

void extend(int root,int& last,char c){
int np=pmem++,p=last;
sa[p].len=sa[last].len+1;
for(;~p && !sa[p].next[c];p=sa[p].link)sa[p].next[c]=np;
if(p==-1)sa[np].link=root;
else{int q=sa[p].next[c];
if(sa[p].len+1==sa[q].len)sa[np].link=q;
else{int nq=pmem++;
sa[nq].len=sa[p].len+1;
copy(sa[q].next,sa[q].next+26,sa[nq].next);
sa[nq].link=sa[q].link;
for(;~p&&sa[p].next[c]==q;p=sa[p].link)
sa[p].next[c]=nq;
sa[q].link=sa[np].link = nq;
}
}
last=np;
}
int dfs(int u){
int &ret=sg[u];
if(~ret)return ret;
bitset<M> mex;
tot[u]=1;
for(int i=0,v;i<26;++i)
if(v=sa[u].next[i]){
int t=dfs(v);
assert(t>=0 && t<M);
mex.set(t);
tot[u]+=tot[v];
for(int i=0;i<M;++i) cnt[u][i]+=cnt[v][i];
}
for(ret=0;mex.test(ret);++ret);
++cnt[u][ret];
assert(ret<M);
return ret;
}
struct dfs_st{int u,i;};
void manualdfs(int r){
vector<dfs_st> st;
for(st.push_back({r,0});!st.empty();){
int u=st.back().u,v;
if(st.back().i==26){
int mex=0;
tot[u]=1;
for(int i=0;i<26;++i)
if(v=sa[u].next[i]){
mex|=1<<sg[v];
tot[u]+=tot[v];
for(int j=0;j<M;++j)cnt[u][j]+=cnt[v][j];
}
for(sg[u]=0;mex>>sg[u] &1;++sg[u]);
++cnt[u][sg[u]];
st.pop_back();
}else
if((v=sa[u].next[st.back().i++])&& !~sg[v])
st.push_back({v,0});
}
}

ull mul(ull a,ull b){
return (b==0||a<inf/b)?a*b:inf;
}
int main(){
int l1,l2;
ull K;
int root1,last1,root2,last2;
scanf("%d%d%llu",&l1,&l2,&K);
getchar();
root1=last1=new_root();
for(int i=0;i<l1;++i)extend(root1,last1,getchar()-'a');
fill(sg+root1,sg+pmem,-1);
//dfs(root1);
manualdfs(root1);

getchar();
root2=last2=new_root();
for(int i=0;i<l2;++i)extend(root2,last2,getchar()-'a');
fill(sg+root2,sg+pmem,-1);
//dfs(root2);
manualdfs(root2);
string ans1,ans2;
int sg1= -1;
ull rcc[M];
for(int i=0;i<M;++i)rcc[i]=tot[root2]-cnt[root2][i];
ull tmp = 0;
for(int i=0;i<M && tmp<K;++i)
tmp+=mul(cnt[root1][i],rcc[i]);
if(tmp<K){
puts("no solution");
return 0;
}
for(int u=root1;;){
if(rcc[sg[u]]>=K){
sg1=sg[u];
puts(ans1.c_str());
break;
}
K-=rcc[sg[u]];
for(int i=0,v;i<26;++i)
if(v=sa[u].next[i]){
ull tmp= 0;
for(int i=0;i<M && tmp<K;++i)
tmp+=mul(cnt[v][i],rcc[i]);
if(tmp>=K){
ans1+=char('a'+i);
u=v;
break;
}
K-=tmp;
}
}
assert(rcc[sg1] >= K);
for(int u=root2;;){
if(K==1 && sg[u]!=sg1) {
puts(ans2.c_str());
return 0;
}
if(sg[u]!=sg1)--K;
for(int i=0,v;i<26;++i)
if(v=sa[u].next[i]){
ull tmp=0;
for(int j=0;j<M;++j)
if(j!=sg1) tmp+=cnt[v][j];
if(tmp>=K){
ans2+= char('a'+i);
u=v;
break;
}
K-=tmp;
}
}
}

Unknown