题意:说实话这个题的题意还真的挺难懂的,我开始看了好久都没看懂,后来百度了下题意才弄懂了,这题的意思就是首先有一个字母的转换表,就是输入的第一行的字符串,就是'a'转成第一个字母,'b'转成转换表的第二个字母·······然后下面一个字符串是密文+明文的形式的字符串。就是说前后两段是重复的,只不过通过转换表转换了下。而且后面一段可能不完整,让我们补完整。

思路:这道题我很久之前就已经a掉了,当时是用普通的kmp做的,稍微变通下就行了。只不过现在正在学习扩展kmp,所以就用扩展kmp做了下,个人觉得普通的kmp还好一点,代码短也容易理解。

我现在讲两种方法:

第一种、普通的kmp首先题目中输入的字符串:密文+明文,假设该字符串为s1,第一步:把s1全部翻译一遍变成:明文+密文,假设该字符串为s2;第二步:我们以s1的后半段为主串,以s2为模式串进行kmp即可。

代码实现:

#include<iostream>
#include<cstring>
using namespace std;
char a[],c[];
int next[];
int main()
{
int T,i,j,len,nima[],mid;
char b[];
while(scanf("%d",&T)!=EOF)
{
getchar();
while(T--)
{
scanf("%s%s",b+,a+);
for(i=;i<=;i++)
nima[b[i]-'a']=i-;
len=strlen(a+);
for(i=;i<=len;i++)
c[i]='a'+nima[a[i]-'a'];
i=;j=;next[]=;
while(i<len)
{
if(j==||c[i]==c[j])
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
if(len%==)
i=len/+;
else
i=len/+;
j=;mid=i;
while(i<=len)
{
if(j==||a[i]==c[j])
{
i++;j++; }
else
j=next[j];
}
for(i=;i<=len;i++)
printf("%c",a[i]);
for(i=j;i<j+len-*j+;i++)
printf("%c",c[i]);
printf("\n");
}
}
return ;
}

第二种、扩展kmp,首先题目中输入的字符串:密文+明文,假设该字符串为s1,第一步:把s1 的后半段翻译译一遍变成:假设该字符串为s2;第二步:以s1为主串,s2为模式串进行一次扩展kmp,得到extend数组;第三步:对extend数组进行一次扫描,如果主串某一位置的后缀与模式串的前缀全部匹配就立即停止,这一位置就是满足的最优解了。

代码实现:

#include<stdio.h>
#include<string.h>
char str1[],T[];
char s1[],S[];
int next[],extend[];
void get_next()
{
int len=strlen(T),j,a,k,p,L;
next[]=len;
a=;
while(a<len-&&T[a]==T[a+])
a++;
next[]=a;
a=;
for(k=;k<len;k++)
{
p=a+next[a]-;
L=next[k-a];
if(k+L->=p)
{
j=p-k+>?p-k+:;
while(j+k<len&&T[j+k]==T[j])
j++;
next[k]=j;
a=k;
}
else
next[k]=L;
}
}
void get_extend()//S为主串,T为模式串
{
int len1,len2,len,j,k,a,p,L;
get_next();
len1=strlen(S);
len2=strlen(T);
len=len1>len2?len2:len1;
a=;
while(a<len&&S[a]==T[a])
a++;
extend[]=a;
a=;
for(k=;k<len1;k++)
{
p=a+extend[a]-;
L=next[k-a];
if(k+L->=p)
{
j=p-k+>?p-k+:;
while(j+k<len1&&j<len2&&S[j+k]==T[j])
j++;
extend[k]=j;
a=k;
}
else
extend[k]=L;
}
}
int main()
{
int t,i,len,mid,max,len1;
while(scanf("%d",&t)!=EOF)
{
getchar();
while(t--)
{
max=-;
scanf("%s",str1);
scanf("%s",T);
for(i=;i<;i++)
s1[str1[i]-'a']=i+'a';
len=strlen(T);
if(len%==)
mid=len/;
else
mid=len/+;
for(i=mid;i<len;i++)
S[i-mid]=str1[T[i]-'a'];
S[i-mid]='\0';
get_extend();
len=strlen(S);
len1=strlen(T);
for(i=;i<len;i++)
if(i+mid+extend[i]==len1)
{
max=extend[i];
break;
}
printf("%s",T);
if(max==-)
max=;
len=strlen(T);
for(i=max;i<len-max;i++)
printf("%c",s1[T[i]-'a']);
printf("\n");
}
}
return ;
}

hdu 4300(kmp)的更多相关文章

  1. hdu 4300 kmp算法扩展

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. HDU - 4300 Clairewd’s message (拓展kmp)

    HDU - 4300 题意:这个题目好难读懂,,先给你一个字母的转换表,然后给你一个字符串密文+明文,密文一定是全的,但明文不一定是全的,求最短的密文和解密后的明文: 题解:由于密文一定是全的,所以他 ...

  3. hdu 1686 KMP模板

    // hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...

  4. Cyclic Nacklace HDU 3746 KMP 循环节

    Cyclic Nacklace HDU 3746 KMP 循环节 题意 给你一个字符串,然后在字符串的末尾添加最少的字符,使这个字符串经过首尾链接后是一个由循环节构成的环. 解题思路 next[len ...

  5. hdu 4300 Clairewd’s message(具体解释,扩展KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300 Problem Description Clairewd is a member of FBI. ...

  6. hdu 4300 Clairewd’s message KMP应用

    Clairewd’s message 题意:先一个转换表S,表示第i个拉丁字母转换为s[i],即a -> s[1];(a为明文,s[i]为密文).之后给你一串长度为n<= 100000的前 ...

  7. (KMP 扩展)Clairewd’s message -- hdu -- 4300

    http://acm.hdu.edu.cn/showproblem.php?pid=4300 Clairewd’s message Time Limit: 2000/1000 MS (Java/Oth ...

  8. HDU 4300 Clairewd’s message(KMP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300 题目大意:题目大意就是给以一段字符xxxxzzz前面x部分是密文z部分是明文,但是我们不知道是从 ...

  9. hdu 4300 Clairewd’s message(扩展kmp)

    Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...

随机推荐

  1. [转载]Java学习这七年

    从2005那会做自动化测试开始接触Java开始,至今近7年.今天正好项目结束,趁机整理下思路,确定后续方向. 前三个年头基本上集中于Java基础的学习,包括设计模式,从完全不懂,到看的懂但似乎又不懂, ...

  2. hdu 4701 Game 博弈论

    思路: ▶ 设 win(i,x,y) 表示当前可以买的物品是 i,先手有 x 元,后 手有 y 元时,先手是否必胜 ▶ win(i,x,y) ⇐⇒∃j((j > i)∧(x ≥ si−sj)∧¬ ...

  3. 李洪强漫谈iOS开发[C语言-037]-if else 语句

    李洪强漫谈iOS开发[C语言-037]-if else 语句

  4. maven 环境搭建 Myeclipse配置

    一:Maven的下载安装 准备工作: 1)安装环境 Windows xp 2)需安装JDK ,并配置环境变量(略) 3) Maven版本3.0.5 4)下载地址:http://mirror.bit.e ...

  5. js中鼠标滚轮事件详解

    js中鼠标滚轮事件详解   (以下内容部分内容参考了http://adomas.org/javascript-mouse-wheel/ ) 之前js 仿Photoshop鼠标滚轮控制输入框取值中已使用 ...

  6. pinyin4j

    最近在倒腾与搜索相关的拼音检查技术,顺便看了一下中文转拼音开源插件pinyin4j的源码,参考资料:http://blog.csdn.net/hfhwfw/archive/2010/11/23/603 ...

  7. 一行很好的JS代码

    [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.rand ...

  8. HDU 4604 deque 最长上升子序列

    枚举每个位置,求以num[i]为起点的最长不下降子序列和以num[i]为结尾的最长不递增子序列. 并且把相同值的个数统计一下,最后要减去算重复了的. 比如: 1 9 4 4 2 2 2 3 3 3 7 ...

  9. python生成验证码脚本

    最近每天都用python写一个小的脚本,练习使用python语法. 验证码的生成: 这里使用了python的图像处理库PIL,安装PIL的过程中出了一个小麻烦,就使用Pillow-win32的一个文件 ...

  10. cpan 配置

    $ cpan Cpan>o conf init 最主要的是配置镜像地址,试了下,还是香港的靠谱…… cpan中镜像地址列表:http://www.cpan.org/SITES.html 香港的镜 ...