【扩展KMP】 HDOJ 4300 Clairewd’s message

来源:互联网 发布:Linux改变所有文件权限 编辑:程序博客网 时间:2024/04/30 23:07

怎么说呢,最近学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, Rtypedef 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;}


0 0
原创粉丝点击