题意:说实话这个题的题意还真的挺难懂的,我开始看了好久都没看懂,后来百度了下题意才弄懂了,这题的意思就是首先有一个字母的转换表,就是输入的第一行的字符串,就是'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. String.IsNullOrEmpty()和String.IsNullOrWhiteSpace()

    转自:http://hi.baidu.com/saclrpqmttbntyq/item/4592fc72c5a19e5c0d0a07eb 由于总用 String.IsNullOrEmpty( s ) ...

  2. MySQL 语句级避免重复插入—— Insert Select Not Exist

    想要插入一条数据,要避免重复插入,又不想折腾两回数据库连接操作,可以参考如下办法. INSERT INTO table(column1,column2,column3 ...columnN) SELE ...

  3. 黑马程序员--C#中属性和字段(变量)的区别

    ---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- 属性为类提供了一种很有用的封装数据 ...

  4. Linux awk小记

    预备知识: -F:表示某行使用的分隔符,默认是空格: NR:表示当前是第几行: NF:表示文件中的某行根据分隔符共有几列: 1.打印某一列 awk '{print $1}' text.txt 其中$0 ...

  5. 【tyvj】P1049 最长不下降子序列

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测 ...

  6. Project Euler 76:Counting summations

    题目链接 原题: It is possible to write five as a sum in exactly six different ways: 4 + 13 + 23 + 1 + 12 + ...

  7. LR_问题_在导入wsdl时出现parsing error

    问题描述:使用LR录制webservice协议的脚本,在导入wsdl时出现parsing error,详见图 问题解决:在导入wsdl时输入的地址错误,只指定了地址的虚拟目录名称,未指定方法名称,应该 ...

  8. SQL Server数据导入导出的几种方法

    在涉及到SQL Server编程或是管理时一定会用到数据的导入与导出, 导入导出的方法有多种,结合我在做项目时的经历做一下汇总: 1. SQL Server导入导出向导,这种方式是最方便的. 导入向导 ...

  9. 如何删除ArcSde Service服务

    1)打开“控制面板”,“服务”,找到“ArcSde Service(somename)”,这里somename就是你的ArcSde服务的真实的名字,记住这个名字(为叙述方便,以下用somename表示 ...

  10. PCL—低层次视觉—点云分割(RanSaC)

    点云分割 点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现.不过多插一句,自Niloy J Mitra教授的Global contrast based salient region ...