题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300
题意就是给你26的字母的加密方式,然后又给了一个串s1是包含加密后的和没有加密的但是没有加密的可能不齐全;求完整的密文和原文;
例如第二个例子:
abcdefghijklmnopqrstuvwxyz
加密方式: qwertyuiopasdfghjklzxcvbnm
s1: qwertabcde
在s1中qwert就是密文,后面的abcde就是原文;
假如加密方式不变,s1变成qwertabc,那么答案还是qwertabcde;
密文的长度肯定大于s1总长度的一半,我们可以把s1后一半当成密文前一半不变,然后解密得到s2,那么s2的Next【len】就是明文的长度;
#include<stdio.h> #include<string.h> const int MAXN = 2e5+7; const int oo = 1e9+7; const int mod = 10007; char s[MAXN], a[MAXN], pass[MAXN]; int next[MAXN]; void GetNext(char s[], int N) { int i=0, j=-1; next[0] = -1; while(i < N) { if(j==-1 || s[i]==s[j]) next[++i] = ++j; else j = next[j]; } } int main() { int T; scanf("%d", &T); while(T--) { int i, N, Mid; scanf("%s%s", s, a); for(i=0; s[i]; i++) { pass[ s[i]-‘a‘ ] = i+‘a‘; } N = strlen(a); Mid = (N+1)/2; for(i=0; i<Mid; i++) s[i] = pass[ a[i]-‘a‘ ]; s[i] = ‘*‘, s[i+1]=0; strcat(s, a+i); GetNext(s, N+1); printf("%s\n", s); Mid = N-next[N+1]; for(i=0; i<Mid; i++) { s[i] = a[i]; s[i+Mid] = pass[ a[i]-‘a‘ ]; } s[i+Mid] = 0; printf("%s\n", s); } return 0; }
时间: 2024-10-20 14:53:26