http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106273#problem/H
题意:给T组数据,每组数据第一行是26个字母表示[a,z]所对应的密文字母。第二行的字符串由两部分组成,第一部分是密文部分,第二部分是明文部分。明文部分可能是不完整的,也可能是完整的输出完整的明文部分
做法二(做法一是用kmp收录在kmp习题大全中):首先求出前一部分的把密文换成明文的字符串c。原字符串s是密文+明文,更改后的字符串c则是明文加其余字母,以s为模式,c为原串进行匹配求出ex[i].当ex[i] + i >= n && i >= ex[i](也就是说密文开始的地方要大于等于明文的长度。等于就是接上因为i是从零开始的)然后分别输出密文和明文。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
const int MAXN=200000;
int nexta[MAXN];
int extend[MAXN];
void EKMP(char s[],char t[])//s主串,t模式串
{
memset(nexta,0,sizeof(nexta));
memset(extend,0,sizeof(extend));
int slen = strlen(s),tlen = strlen(t);
int len = min(slen,tlen);
nexta[0] = tlen