扩展KMP很容易就明白过来了。
注意的是,后面明文的长度要少于密文,而且当前K+Extend[k]>=L
输出时犯了很多次二,后来人注意吧。
#include#include #include #include using namespace std;char t[30];char table[30];char code[100005];char chan[100005];int next[100005];int extand[100005];void Next(const char *T){ int len=strlen(T),a=0; next[0]=len; while(a = p){ int j = (p-k+1)>0 ? (p-k+1) : 0; while(k+j < tlen ? slen : tlen; while(a = p){ int j= (p-k+1) > 0 ? (p-k+1) : 0; while(k+j >t>>code; for(int i=0;i<26;i++){ table[t[i]-'a']=i+'a'; } int L=strlen(code); for(int i=0;i<=L;i++){ chan[i]=table[code[i]-'a']; } Next(chan); GetExtand(code,chan); for(k=0;k =L&&extand[k]<=k) break; } for(int i=0;i