KMP HDOJ 4300 Clairewd's message
2024-08-21 06:02:30
题意:完全不懂,最后还是看题解才理解了。第一行字符串是密文变成明文的规则,比如第二个样例:“qwertyuiopasdfghjklzxcvbnm”,‘q'对应的明文为’a','w'对应'b'....... 第二行是密文+明文的形式,明文有密文转换来,但不完整,求原来最小的可能文本。
分析:将密文+明文都当做密文转成明文,那么转换后的字符串前缀密文的部分解密,和原来的字符串的后缀明文匹配,从原来字符串的后半部分和转换之后的字符串的开头开始匹配,得到的是明文(密文)的长度。详细解释
收获:题目读不懂多读几遍,再不行yy题意,想想会涉及什么算法
代码:
/************************************************
* Author :Running_Time
* Created Time :2015-8-24 19:42:24
* File Name :A.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
char ch[30], m[30], s[N], rs[N];
int fail[N]; void get_fail(char *P, int lenp) {
int i = 0, j = -1; fail[0] = -1;
while (i < lenp) {
if (j == -1 || P[j] == P[i]) {
i++; j++; fail[i] = j;
}
else j = fail[j];
}
} int KMP(char *T, char *P) {
int lent = strlen (T), lenp = strlen (P);
get_fail (P, lenp);
int i = 0, j = 0;
while (i < lent) {
while (j != -1 && T[i] != P[j]) j = fail[j];
i++; j++;
}
return j;
} int main(void) {
int T; scanf ("%d", &T);
while (T--) {
scanf ("%s%s", &ch, &s);
for (int i=0; i<26; ++i) {
m[ch[i]-'a'] = 'a' + i;
}
int len = strlen (s);
for (int i=0; i<len; ++i) {
rs[i] = m[s[i]-'a'];
}
int k = KMP (s + (len + 1) / 2, rs);
for (int i=0; i<len-k; ++i) printf ("%c", s[i]);
for (int i=0; i<len-k; ++i) printf ("%c", rs[i]);
puts ("");
} return 0;
}
最新文章
- Javascript外部对象
- [ASP.NET MVC 小牛之路]11 - Filter
- (原创)Xilinx的ISE生成模块ngc网表文件
- CONTAINING_RECORD的实现
- 用java操作XML文件(DOM解析方式)
- Sonar+Hudson+Maven构建系列之三:安装Hudson
- ios开发——实用技术篇Swift篇&;播放MP3
- POJ_3068_Shortest_pair_of_paths_(最小费用流)
- C++创建动态链接库(*.dll)
- jQuery版推箱子游戏详解和源码
- awk中{print $1}什么意思
- CCF认证之——相反数
- python爬虫(7)——BeautifulSoup
- UE4代码片断备份
- Android JNI 学习(二):JNI 设计机制
- FTP服务器搭建与访问的相关问题
- 混合app开发--js和webview之间的交互总结
- 【规范】前端编码规范——html 规范
- 【CF480D】Parcels DP
- WebService与CXF