hdu4300之KMP&&EKMP
Clairewd’s message
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2398 Accepted Submission(s): 942
Unfortunately, GFW(someone's name, not what you just think about) has detected their action. He also got their conversion table by some unknown methods before. Clairewd was so clever and vigilant that when she realized that somebody was monitoring their action, she just stopped transmitting messages.
But GFW knows that Clairewd would always firstly send the ciphertext and then plaintext(Note that they won't overlap each other). But he doesn't know how to separate the text because he has no idea about the whole message. However, he thinks that recovering the shortest possible text is not a hard task for you.
Now GFW will give you the intercepted text and the conversion table. You should help him work out this problem.
Each test case contains two lines. The first line of each test case is the conversion table S. S[i] is the ith latin letter's cryptographic letter. The second line is the intercepted text which has n letters that you should recover. It is possible that the text is complete.
Range of test data:
T<= 100 ;
n<= 100000;
abcdefghijklmnopqrstuvwxyz
abcdab
qwertyuiopasdfghjklzxcvbnm
qwertabcde
qwertabcde
题意比较难理解,就是说给定两组字符串,第一组只有26个字符表对应明文中a,b,c,d....z可以转换第一个,第二个...第26个字符变成密文,
第二组字符串是给定的密文+明文,明文可能不完整(缺失或没有),叫你补完且整个密文+明文是最短的
如果有多种明文则取最大的明文
分析:因为可能有多种明文且密文>=明文,所以将字符串的前一半(一定是密文)转换成明文和后一部分进行匹配,如果从后面某个位置能匹配到末尾,则表示那一部分是明文,然后进行补充完整输出即可//这里根据key得到密文转换成明文的钥匙b,不用明文转换成密文匹配是因为明文可能有多种,后面一部分不一定是明文,根据b将密文转换成明文(一定是最大的明文,因为b里面转换成的明文字符一定是最大的,比如key:aa....,则b:b.....)
EKMP:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 999999999
using namespace std; const int MAX=100000+10;
char s1[MAX],s2[MAX],a[27],b[27];
int next[MAX]; void get_next(char *a,int len){
int k=0,i=1;
next[0]=len;//本题无作用
while(k+1<len && a[k] == a[k+1])++k;
next[1]=k;
k=1;
while(++i<len){
int maxr=k+next[k]-1;
next[i]=min(next[i-k],max(maxr-i+1,0));
while(i+next[i]<len && a[next[i]] == a[i+next[i]])++next[i];
if(i+next[i]>k+next[k])k=i;
}
} int main(){
int T,k;
cin>>T;
while(T--){
cin>>a>>s1;
for(int i=0;i<26;++i)b[a[i]-'a']=i+'a';
int len=strlen(s1);
for(int i=0;i<(len+1)/2;++i)s2[i]=b[s1[i]-'a'];//将密文转换为明文,密文长度>=明文长度
for(int i=(len+1)/2;i<=len;++i)s2[i]=s1[i];
get_next(s2,len);
for(k=(len+1)/2;k<len;++k){
if(next[k] == len-k)break;
}
cout<<s1;
for(int i=len-k;i<k;++i)cout<<b[s1[i]-'a'];
cout<<endl;
}
return 0;
}
KMP:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 999999999
using namespace std; const int MAX=100000+10;
char s1[MAX],s2[MAX],a[27],b[27];
int next[MAX]; void get_next(char *a,int len){
int i=-1,j=0;
next[0]=-1;
while(j<len){
if(i == -1 || a[i] == a[j])next[++j]=++i;
else i=next[i];
}
} int main(){
int T;
cin>>T;
while(T--){
cin>>a>>s1;
for(int i=0;i<26;++i)b[a[i]-'a']=i+'a';
int len=strlen(s1),k=len;
for(int i=0;i<(len+1)/2;++i)s2[i]=b[s1[i]-'a'];//将密文转换为明文,密文长度>=明文长度
for(int i=(len+1)/2;i<=len;++i)s2[i]=s1[i];
get_next(s2,len);
while(next[k]>len/2)k=next[k];
cout<<s1;
for(int i=next[k];i<len-next[k];++i)cout<<b[s1[i]-'a'];
cout<<endl;
}
return 0;
}
hdu4300之KMP&&EKMP的更多相关文章
- 复习下KMP&e-KMP
KMP算法的核心思想是next数组. 接下来,我来谈谈我对KMP数组的理解. KMP算法是用来匹配有多少相同字串的一种算法. 1.next数组记录前缀与后缀相等的位置,然后跳到这. 2.数组即记录后缀 ...
- (25+4/25+4)复健-KMP/EKMP/manache/Trie
(29/29) 3.23已完成 1.KMP int Next[maxn]; void prekmp(char* x,int len){ ,suf=; Next[]=-; while(suf<l ...
- hdu-4300(kmp或者拓展kmp)
题意:乱七八糟说了一大堆,就是先给你一个长度26的字符串,对应了abcd....xyz,这是一个密码表.然后给你一个字符串,这个字符串是不完整的(完整的应该是前半部分是加密的,后半部分是解密了的),然 ...
- kmp基础 ekmp
+]; int lenp,lens; +];//可以是char 也可以是string +]; void getnext() { nex[]=-; ,j=; ) { ||p[j]==p[k]) nex[ ...
- hdu4300 Clairewd’s message 扩展KMP
Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...
- hdu------(4300)Clairewd’s message(kmp)
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- kuangbin专题十六 KMP&&扩展KMP HDU3613 Best Reward(前缀和+manacher or ekmp)
After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...
- HDU4300 Clairewd’s message(拓展kmp)
Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...
- kuangbin专题十六 KMP&&扩展KMP HDU4300 Clairewd’s message
Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...
随机推荐
- jQuery 插件入门
先看http://www.cnblogs.com/lideng/p/3605551.html http://www.cnblogs.com/xcj26/p/3345556.html (非常细致 很多 ...
- Visual Studio 常用快捷键总结
删除或剪切一行: Ctrl + X 或者 Shift+Delete格式化整个文档: Ctrl + K + D 或者 Ctrl+E+D智能感知: Ctrl + J 或者 Alt+→折叠所有方法: C ...
- Linux Apache绑定多域名
1 网上查到资源不符 网上查到的Apache绑定域名都说要修改http.conf文件,但是我的服务器上的apache是通过apt-get install安装的,安装方法应该是没错的,但是通过find ...
- PHP并发最佳实践
直接参考大牛的: http://www.searchtb.com/2012/06/rolling-curl-best-practices.html
- Javascript 风格向导
序 大部分针对Javascript最合理的方法归纳. 类型 • 原始类型:我们可以直接使用值. ο string ο number ο boolean ο null ο undefined ...
- Java图形化界面设计——布局管理器之null布局(空布局)
一般容器都有默认布局方式,但是有时候需要精确指定各个组建的大小和位置,就需要用到空布局. 操作方法: 1) 首先利用setLayout(null)语句将容器的布局设置为null布局(空布局 ...
- 网页在Safari快速滚动和回弹的原理: -webkit-overflow-scrolling : touch;的实现
现在很多for Mobile的H5网页内都有快速滚动和回弹的效果,看上去和原生app的效率都有得一拼. 要实现这个效果很简单,只需要加一行css代码即可: -webkit-overflow-scrol ...
- 仿36氪(iOS版附源代码)
前言: 这是我2016年3月开始写的,利用课余时间全心投入的项目,本以为是凭着轻松愉悦的方式来学习的,中途遇到bug解决bug的时候,每天晚上几乎都是写到寝室关灯,还有一次使用Github不当写了五天 ...
- iOS 饼状图
首先先看一下效果: 一.创建饼状图对象 创建饼状图对象用到类是PieChartView.h, 代码如下: self.pieChartView = [[PieChartView alloc] ini ...
- C# - 通过自定义注解反射生成SQL语句[转]
转自http://blog.163.com/jong_cai/blog/static/87028045200902033553581/ -------------------------------- ...