题目大意:
输入样例个数,每个样例有两行,第一行是26个字母,分别代表a~z加密后的密文;第二行代表一串密文+明文,密文一定是完整的,但明文可能不完整,让你输出最短的(密文+明文);
基本思路:
拓展kmp,因为密文是完整的,所以它的长度必然是一半以上,所以把前一半转换成明文放到另一个数组里,然后后半部分原封不动的放到该数组里,然后拓展kmp,求一下next,然后从一半以后一直往后找,找到的话,就跳出,然后基本把把问题解决了;
代码如下:
#include#include #include using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;const int maxn = 100000+10;int nx[maxn],ex[maxn];char S[maxn],T[maxn];char s1[maxn],a[27],b[27];int lent,lens;void getNext(){ nx[0]=lent; int j=0; while(j+1