Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=2e5+7;
- struct SAM{
- int Max[N];
- int Min[N];
- int to[N][26];
- int fa[N];
- int sg[N];
- ll cnt[N][27];
- ll sum[N];
- int tot;
- inline int NewNode(int mx,int mi,int *tr,int su){
- ++tot;
- Max[tot]=mx;
- Min[tot]=mi;
- if(tr!=NULL)memcpy(to[tot],tr,26<<2);
- fa[tot]=su;
- sg[tot]=-1;
- return tot;
- }
- inline int extend(int u,int c){
- int t=NewNode(Max[u]+1,0,NULL,0);
- for(;u&&!to[u][c];u=fa[u])to[u][c]=t;
- if(!u){
- Min[t]=1;
- fa[t]=1;
- return t;
- }
- int v=to[u][c];
- if(Max[v]==Max[u]+1){
- Min[t]=Max[v]+1;
- fa[t]=v;
- return t;
- }
- int x=NewNode(Max[u]+1,0,to[v],fa[v]);
- Min[t]=Min[v]=Max[x]+1;
- fa[t]=fa[v]=x;
- Min[x]=Min[fa[x]]+1;
- for(;u&&to[u][c]==v;u=fa[u])to[u][c]=x;
- return t;
- }
- queue<int>Q;
- int calcSG(int u){
- if(~sg[u])return sg[u];
- bool vis[27]={0};
- for(int i=0;i<26;++i){
- if(!to[u][i])continue;
- vis[calcSG(to[u][i])]=1;
- for(int j=0;j<27;++j)cnt[u][j]+=cnt[to[u][i]][j];
- }
- for(int i=0;i<27;++i){
- if(vis[i])continue;
- sg[u]=i;
- break;
- }
- ++cnt[u][sg[u]];
- for(int i=0;i<27;++i)sum[u]+=cnt[u][i];
- return sg[u];
- }
- inline void build(char *s){
- int n=strlen(s);
- int lst=NewNode(0,0,NULL,0);
- for(int i=0;i<n;++i)lst=extend(lst,s[i]-'a');
- calcSG(1);
- }
- inline ll cnt1(int u,int x){
- return cnt[u][x];
- }
- inline ll cnt2(int u,int x){
- return sum[u]-cnt[u][x];
- }
- }A,B;
- ll k;
- char s[N];
- char t[N];
- char a[N];
- char b[N];
- inline ll calc(int u,int v){
- ll ans=0;
- for(int i=0;i<27;++i){
- ans+=A.cnt1(u,i)*B.cnt2(v,i);
- }
- return ans;
- }
- inline int dfsA(int x,int u){
- if(B.cnt2(1,A.sg[u])>=k)return u;
- k-=B.cnt2(1,A.sg[u]);
- for(int i=0;i<26;++i){
- if(!A.to[u][i])continue;
- ll t=calc(A.to[u][i],1);
- if(t<k)k-=t;
- else {
- a[x]=i+'a';
- return dfsA(x+1,A.to[u][i]);
- }
- }
- return 0;
- }
- inline void dfsB(int x,int u,int v){
- k-=(B.sg[u]!=v);
- if(k==0)return ;
- for(int i=0;i<26;++i){
- if(!B.to[u][i])continue;
- ll t=B.cnt2(B.to[u][i],v);
- if(t<k)k-=t;
- else {
- b[x]=i+'a';
- return dfsB(x+1,B.to[u][i],v);
- }
- }
- }
- int main(){
- scanf("%lld%s%s",&k,s,t);
- A.build(s);
- B.build(t);
- int t=dfsA(0,1);
- if(!t)return puts("NO"),0;
- dfsB(0,1,A.sg[t]);
- printf("%s\n",a);
- printf("%s\n",b);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement