怎么说呢,最近学KMP学的很浮躁,很不想学,这次的扩展KMP真的是没理解,只好弄出一份模板。。。以后有时间抽空补上好了。。。
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#define maxn 100005
#define eps 1e-6
#define mod 10007
#define INF 99999999
#define lowbit(x) (x&(-x))
//#define lson o<<1, L, mid
//#define rson o<<1 | 1, mid+1, R
typedef long long LL;
using namespace std;
struct node
{
char s[maxn];
char t[maxn];
int next[maxn];
int extend[maxn];
int slen, tlen;
void init(void)
{
slen = strlen(s);
tlen = strlen(t);
memset(next, 0, sizeof next);
memset(extend, 0, sizeof extend);
}
void getnext(void)
{
int a = 0, p, l, j, i;
next[0] = tlen;
while(a + 1 < tlen && t[a] == t[a+1]) ++a;
next[1] = a;
a = 1;
for(i = 2; i < tlen; i++) {
p = a + next[a] -1;
l = next[i - a];
if(l + i - 1 < p) next[i] = l;
else{
j = max(p - i + 1, 0);
while(j + i< tlen && t[i+j] == t[j]) ++j;
next[i] = j;
a = i;
}
}
}
void getextend(void)
{
int a = 0, p, l, j, i;
while(a < slen && s[a] == t[a]) ++a;
extend[0] = a;
a = 1;
for(i = 1; i < slen; i++) {
p = a + extend[a] -1;
l = next[i - a];
if(l + i - 1 < p) extend[i] = l;
else{
j = max(p - i + 1, 0);
while(j + i< tlen && s[i+j] == t[j]) ++j;
extend[i] = j;
a = i;
}
}
}
}tmp;
char str[50];
int id[50];
int len;
void read(void)
{
int i;
scanf("%s", str);
for(i = 0; i < 26; i++) id[str[i] - 'a'] = i;
scanf("%s", tmp.s);
len = strlen(tmp.s);
for(i = 0; i < len; i++) tmp.t[i] = id[tmp.s[i] - 'a'] + 'a';
}
void debug(void)
{
int i;
for(i = 0; i <tmp.slen; i++) printf("%d\n", tmp.extend[i]);
}
void work(void)
{
int i, j;
tmp.init();
tmp.getnext();
tmp.getextend();
for(i = 0; i < len; i++)
if(i + tmp.extend[i] >= len && i >= tmp.extend[i])
break;
for(j = 0; j < i; j++) printf("%c", tmp.s[j]);
for(j = 0; j < i; j++) printf("%c", tmp.t[j]);
printf("\n");
}
int main(void)
{
int _;
while(scanf("%d", &_)!=EOF) {
while(_--){
read();
work();
}
}
return 0;
}