HDU - 4300 Clairewd’s message(KMP)
2015-10-26 23:05
573 查看
题目大意:给你一个转码串和一个密码,密码由密文和明文构成,密文是完整的,明文有可能不完整。问需要添加多少个明文,才能使明文转码后和密文相同。最后要求输出添加了字符的串
解题思路:刚开始是密文+明文的串,那么我转换一下,就变成了明文+密文的串了,又因为密文是完整的,所以转码后,只能取走后半部分
接着用原来的串和转码后的后半部分比一下,找出拥有的最长公共子串,那么两个公共串中间的字符,就是需要添加的字符了
解题思路:刚开始是密文+明文的串,那么我转换一下,就变成了明文+密文的串了,又因为密文是完整的,所以转码后,只能取走后半部分
接着用原来的串和转码后的后半部分比一下,找出拥有的最长公共子串,那么两个公共串中间的字符,就是需要添加的字符了
#include <cstdio> #include <cstring> const int N = 100010; char code , s1 , s2 , trans ; int len; int next ; void init() { scanf("%s%s", code, s1); len = strlen(s1); strcpy(s2, s1 + (len + 1) / 2); printf("%s", s1); for (int i = 0; s1[i]; i++) for (int j = 0; j < 26; j++) if (s1[i] == code[j]) { s1[i] = 'a' + j; break; } } void getFail() { int i = 0, j = -1; next[0] = -1; while (s1[i]) { if (j == -1 || s1[i] == s1[j]) { i++; j++; next[i] = j; } else j = next[j]; } } void solve() { int len1 = strlen(s1), len2 = strlen(s2); int i = 0, j = 0; getFail(); while (i < len2) { if (j == -1 || s1[j] == s2[i]) { i++; j++; if (i == len2) break; } else j = next[j]; } for(int i = j; i < len1 - j; i++) printf("%c", s1[i]); printf("\n"); } int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0; }
相关文章推荐
- staitc用于函数内部和函数外部的不同
- 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
- Ubuntu启动碰到waitting for network configuration 或者 up to 60s的问题
- ORACLE中Drop table cascade constraints之后果.
- HDU 1789 Doing Homework again(馋)
- hdu 4630 No Pain No Game(线段树)
- leetcode contains duplicate III
- Daily Scrum 10.26
- Daily Scrum 10.25
- POJ 2027 No Brainer
- 【PAT】1014. Waiting in Line (30)
- 图像滤镜艺术---Photoshop实现Instagram之Mayfair滤镜效果
- .NET 通过SmtpClient发送邮件 提示 4.7.1 service unavailable try again later 解决办法
- IO_COMPLETION Wait Type
- uva10780 - Again Prime? No time
- Could not obtain transaction-synchronized Session for current thread
- Windows 2008 R2 AD系列四:Domain User权限运行软件
- 使用行为树(Behavior Tree)实现游戏AI
- 程序设计师不是那么好当的 (真实案例一起动动脑)
- Daily Scrumming* 2015.10.25(Day 6)