Advertisement
yicongli

HIHO1466

Mar 7th, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=2e5+7;
  17.  
  18. struct SAM{
  19.     int Max[N];
  20.     int Min[N];
  21.     int to[N][26];
  22.     int fa[N];
  23.     int sg[N];
  24.     ll cnt[N][27];
  25.     ll sum[N];
  26.    
  27.     int tot;
  28.    
  29.     inline int NewNode(int mx,int mi,int *tr,int su){
  30.         ++tot;
  31.         Max[tot]=mx;
  32.         Min[tot]=mi;
  33.         if(tr!=NULL)memcpy(to[tot],tr,26<<2);
  34.         fa[tot]=su;
  35.         sg[tot]=-1;
  36.         return tot;
  37.     }
  38.    
  39.     inline int extend(int u,int c){
  40.         int t=NewNode(Max[u]+1,0,NULL,0);
  41.         for(;u&&!to[u][c];u=fa[u])to[u][c]=t;
  42.         if(!u){
  43.             Min[t]=1;
  44.             fa[t]=1;
  45.             return t;
  46.         }
  47.         int v=to[u][c];
  48.         if(Max[v]==Max[u]+1){
  49.             Min[t]=Max[v]+1;
  50.             fa[t]=v;
  51.             return t;
  52.         }
  53.         int x=NewNode(Max[u]+1,0,to[v],fa[v]);
  54.         Min[t]=Min[v]=Max[x]+1;
  55.         fa[t]=fa[v]=x;
  56.         Min[x]=Min[fa[x]]+1;
  57.         for(;u&&to[u][c]==v;u=fa[u])to[u][c]=x;
  58.         return t;
  59.     }
  60.    
  61.     queue<int>Q;
  62.    
  63.     int calcSG(int u){
  64.         if(~sg[u])return sg[u];
  65.         bool vis[27]={0};
  66.         for(int i=0;i<26;++i){
  67.             if(!to[u][i])continue;
  68.             vis[calcSG(to[u][i])]=1;
  69.             for(int j=0;j<27;++j)cnt[u][j]+=cnt[to[u][i]][j];
  70.         }
  71.         for(int i=0;i<27;++i){
  72.             if(vis[i])continue;
  73.             sg[u]=i;
  74.             break;
  75.         }
  76.         ++cnt[u][sg[u]];
  77.         for(int i=0;i<27;++i)sum[u]+=cnt[u][i];
  78.         return sg[u];
  79.     }
  80.    
  81.     inline void build(char *s){
  82.         int n=strlen(s);
  83.         int lst=NewNode(0,0,NULL,0);
  84.         for(int i=0;i<n;++i)lst=extend(lst,s[i]-'a');
  85.         calcSG(1);
  86.     }
  87.    
  88.     inline ll cnt1(int u,int x){
  89.         return cnt[u][x];
  90.     }
  91.    
  92.     inline ll cnt2(int u,int x){
  93.         return sum[u]-cnt[u][x];
  94.     }
  95.    
  96. }A,B;
  97.            
  98. ll k;
  99. char s[N];
  100. char t[N];
  101. char a[N];
  102. char b[N];
  103.  
  104. inline ll calc(int u,int v){
  105.     ll ans=0;
  106.     for(int i=0;i<27;++i){
  107.         ans+=A.cnt1(u,i)*B.cnt2(v,i);
  108.     }
  109.     return ans;
  110. }
  111.  
  112. inline int dfsA(int x,int u){
  113.     if(B.cnt2(1,A.sg[u])>=k)return u;
  114.     k-=B.cnt2(1,A.sg[u]);
  115.     for(int i=0;i<26;++i){
  116.         if(!A.to[u][i])continue;
  117.         ll t=calc(A.to[u][i],1);
  118.         if(t<k)k-=t;
  119.         else {
  120.             a[x]=i+'a';
  121.             return dfsA(x+1,A.to[u][i]);
  122.         }
  123.     }
  124.     return 0;
  125. }
  126.  
  127. inline void dfsB(int x,int u,int v){
  128.     k-=(B.sg[u]!=v);
  129.     if(k==0)return ;
  130.     for(int i=0;i<26;++i){
  131.         if(!B.to[u][i])continue;
  132.         ll t=B.cnt2(B.to[u][i],v);
  133.         if(t<k)k-=t;
  134.         else {
  135.             b[x]=i+'a';
  136.             return dfsB(x+1,B.to[u][i],v);
  137.         }
  138.     }
  139. }
  140.  
  141. int main(){
  142.     scanf("%lld%s%s",&k,s,t);
  143.     A.build(s);
  144.     B.build(t);
  145.     int t=dfsA(0,1);
  146.     if(!t)return puts("NO"),0;
  147.     dfsB(0,1,A.sg[t]);
  148.     printf("%s\n",a);
  149.     printf("%s\n",b);
  150.     return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement