HDOJ 4300 Clairewd's message(扩展KMP)
来源:互联网 发布:informix端口 编辑:程序博客网 时间:2024/05/18 00:29
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4300
本题题意是给你一个字符对应表,再给一个密文和明文相连接的串(明文后缀可能缺失),求补全后的串。
比如样例:
abcdefghijklmnopqrstuvwxyzabcdab
为了方便,字符对应表是默认的。abcdab便是密文和明文相连接的串,记长度为m,我们需要找到分割点。
利用扩展KMP将该串所有后缀与该串前缀进行匹配,如果能匹配到最后一个字符,即k+P[k] == m,则该处可进行分割,找到最小的k值,即可进行最小分割。还要注意,k位置必须在串的后一半,即串中密文字符数不能少于明文字符数。匹配的时候前缀部分要根据字符转换表进行转换(即将前缀看成密文,将其转换为明文,再与后缀部分明文进行匹配)。
代码如下:
#include <cstdio>#include <cstring>using namespace std;int P[100010];char table[26], rev_table[26];char B[100010];int ex_preprocess(char* B, int* P, int m = -1){ int a = 0, p, L; if (m == -1) m = strlen(B); P[0] = m; while (a < m - 1 && B[a] == table[B[a + 1] - 'a']) a++; P[1] = a; a = 1; for (int k = 2; k < m; k++) { p = a + P[a] - 1; L = P[k - a]; if ((k - 1) + L >= p) { int j = (p - k + 1) > 0 ? (p - k + 1) : 0; while (k + j < m && table[B[k + j] - 'a'] == B[j]) j++; P[k] = j; a = k; } else P[k] = L; if (k > ((m - 1) >> 1) && k + P[k] == m) return k; } return m;}void make_rev_table(char table[26], char rev_table[26]){ for (int i = 0; i < 26; i++) rev_table[table[i] - 'a'] = 'a' + i;}int main(){ int t; scanf("%d", &t); while (t--) { scanf("%s%s", table, B); make_rev_table(table, rev_table); int m = strlen(B); int index = ex_preprocess(B, P, m); for (int i = 0; i < index; i++) printf("%c", B[i]); for (int i = 0; i < index; i++) printf("%c", rev_table[B[i] - 'a']); printf("\n"); } return 0;}
- HDOJ 4300 Clairewd's message(扩展KMP)
- 【扩展KMP】 HDOJ 4300 Clairewd’s message
- hdu 4300 Clairewd’s message 扩展kmp
- hdu 4300 Clairewd’s message(扩展KMP)
- HDU 4300 Clairewd’s message(扩展KMP)
- hdu 4300 Clairewd’s message (扩展kmp)
- HDU 4300Clairewd’s message 扩展kmp || kmp
- hdu 4300 Clairewd’s message(详解,扩展KMP)
- HDU 4300 Clairewd’s message(扩展KMP)
- HDU 4300 Clairewd’s message(扩展kmp)
- HDU-4300 Clairewd’s message + 4333(扩展KMP)
- hdu 4300 Clairewd’s message(扩展KMP)
- HDU 4300 Clairewd’s message(扩展KMP)
- HDOJ 4300 Clairewd’s message
- HDOJ 4300 Clairewd’s message
- hdu4300 Clairewd’s message(扩展KMP)
- hdu4300 Clairewd’s message 扩展KMP
- HDU4300 Clairewd’s message 扩展kmp
- C# 网络编程系列七:UDP编程补充——UDP广播程序的实现
- 成绩处理
- cloud foundry源码启动(1)
- 查看linux系统/文件 是32位还是64位
- poj1024
- HDOJ 4300 Clairewd's message(扩展KMP)
- VS2008内存泄露检测 .
- 增改查
- 用筛选法求素数
- 在CMD下用java命令出现“找不到或无法加载主类”问题
- ubuntu server 10.4下NFS服务的配置
- [GDB-7] gdb 的学习
- PCA方法简介
- SVN环境搭建