//扩展kmp+暴力枚举分割点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int next1[200100];
int extend[200100];
void ex_kmp(char s[],char t[])//s[]为主串,t[]为模式串
{
int i,j,p,l;
int len=strlen(t);
int len1=strlen(s);
memset(next1,0,sizeof(next1));
memset(extend,0,sizeof(extend));
next1[0]=len;
j=0;
while(j+1<len&&t[j]==t[1+j]) j++;
next1[1]=j;
int a=1;
for(int i=2;i<len;i++)
{
p=next1[a]+a-1;
l=next1[i-a];
if(i+l<p+1) next1[i]=l;
else
{
j=max(0,p-i+1);
while(i+j<len&&t[i+j]==t[0+j]) j++;
next1[i]=j;
a=i;
}
}
j=0;
while(j<len1&&j<len&&s[j]==t[j]) j++;
extend[0]=j;
a=0;
for(i=1;i<len1;i++)
{
p=extend[a]+a-1;
l=next1[i-a];
if(l+i<p+1)next1[i]=l;
else
{
j=max(0,p-i+1);
while(i+j<len1&&j<len&&s[i+j]==t[j]) j++;
extend[i]=j;
a=i;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
map<char,char>ps;
ps.clear();
char s[30];
scanf("%s",s);
for(int i=0;i<strlen(s);i++)
{
ps[s[i]]='a'+i;
}
char k[200100];
scanf("%s",k);
char k1[200100];
//建立模式串
int t=strlen(k);
for(int i=0;i<t;i++)
{
k1[i]=ps[k[i]];
}
//扩展kmp,求extend数组
ex_kmp(k,k1);
//枚举分割点
int ans;
for(ans=0;ans<t;ans++)
{
if(ans+extend[ans]>=t&&ans>=extend[ans]) {
break;
}
}
for(int i=0;i<ans;i++)
printf("%c",k[i]);
for(int i=0;i<ans;i++)
printf("%c",ps[k[i]]);
printf("\n");
}
return 0;
}
hdu 4300 扩展kmp+暴力枚举分割点
最新推荐文章于 2024-10-16 00:00:43 发布