#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<sstream>
#include<queue>
#define ll long long
#define lll unsigned long long
#define MAX 5000009
#define MAXN 2009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
#define clr(a) memset(a,0,sizeof(a))
#define clr1(a) memset(a,-1,sizeof(a))
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
inline ll Max(ll a,ll b)
{
return a>b?a:b;
}
inline ll Min(ll a,ll b)
{
return a<b?a:b;
}
struct node
{
char x;
int pos;
};
char s[MAX];//模式串
char text[MAX];//文本串
char ans[MAX];//最后剩下的串
int Next[MAX];//失配数组
void getfail(char* s,int* f)//求失配数组
{
int m = strlen(s);
int j = 0,k = -1;
Next[0] = -1;
while(j<m)
{
if(k==-1||s[j]==s[k])
{
j++;
k++;
Next[j] = k;
}
else
k = Next[k];
}
}
void kmp(int m,int n)
{
int i = 0,j = 0;
stack<node>S;
while(i<n)
{
if(j==-1||text[i]==s[j])
{
i++;
j++;
node ss;
ss.x = text[i - 1];//已经匹配的最后一个字符
ss.pos = j;//接下来要匹配模式串的位置
//cout<<ss.x<<" "<<ss.pos<<endl;
S.push(ss);//每次进去的 j 都是将要匹配的位置 !!
}
else
j = Next[j];
if(j==m)//恰好完全匹配
{
int tmp = m;
while(tmp--) S.pop();//删除m个
if(S.empty()) j = 0;//如果为空,模式串从头开始
else j = S.top().pos;//否则将要比较模式串的第 j 个位置
}
}
int num=0;
while(!S.empty())
{
ans[num++]=S.top().x;
S.pop();
}
for(int i=num-1;i>=0;i--)
printf("%c",ans[i] );
printf("\n");
}
int main()
{
while(~scanf("%s%s",s,text))
{
int m = strlen(s);
int n = strlen(text);
getfail(s,Next);
// for(int i = 0;i<m;i++)
// {
// cout<<i<<" "<<Next[i]<<endl;
// }
kmp(m,n);
}
return 0;
}
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<sstream>
#include<queue>
#define ll long long
#define lll unsigned long long
#define MAX 5000009
#define MAXN 2009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
#define clr(a) memset(a,0,sizeof(a))
#define clr1(a) memset(a,-1,sizeof(a))
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
inline ll Max(ll a,ll b)
{
return a>b?a:b;
}
inline ll Min(ll a,ll b)
{
return a<b?a:b;
}
struct node
{
char x;
int pos;
};
char s[MAX];//模式串
char text[MAX];//文本串
char ans[MAX];//最后剩下的串
int Next[MAX];//失配数组
void getfail(char* s,int* f)//求失配数组
{
int m = strlen(s);
int j = 0,k = -1;
Next[0] = -1;
while(j<m)
{
if(k==-1||s[j]==s[k])
{
j++;
k++;
Next[j] = k;
}
else
k = Next[k];
}
}
void kmp(int m,int n)
{
int i = 0,j = 0;
stack<node>S;
while(i<n)
{
if(j==-1||text[i]==s[j])
{
i++;
j++;
node ss;
ss.x = text[i - 1];//已经匹配的最后一个字符
ss.pos = j;//接下来要匹配模式串的位置
//cout<<ss.x<<" "<<ss.pos<<endl;
S.push(ss);//每次进去的 j 都是将要匹配的位置 !!
}
else
j = Next[j];
if(j==m)//恰好完全匹配
{
int tmp = m;
while(tmp--) S.pop();//删除m个
if(S.empty()) j = 0;//如果为空,模式串从头开始
else j = S.top().pos;//否则将要比较模式串的第 j 个位置
}
}
int num=0;
while(!S.empty())
{
ans[num++]=S.top().x;
S.pop();
}
for(int i=num-1;i>=0;i--)
printf("%c",ans[i] );
printf("\n");
}
int main()
{
while(~scanf("%s%s",s,text))
{
int m = strlen(s);
int n = strlen(text);
getfail(s,Next);
// for(int i = 0;i<m;i++)
// {
// cout<<i<<" "<<Next[i]<<endl;
// }
kmp(m,n);
}
return 0;
}