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

    1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单表(order)中统计中,生 ...

  2. POJ 1258 Agri-Net(最小生成树,模板题)

    用的是prim算法. 我用vector数组,每次求最小的dis时,不需要遍历所有的点,只需要遍历之前加入到vector数组中的点(即dis[v]!=INF的点).但其实时间也差不多,和遍历所有的点的方 ...

  3. POJ1789Truck History

    题意 : 说实话,题意我没看懂,后来让人给我讲的样例..... 4 aaaaaaa baaaaaa abaaaaa aabaaaa 0 这个样例的话,就是输入n下面n行,每行7个字母,让你依次选两行进 ...

  4. POJ2586Y2K Accounting Bug

    http://poj.org/problem?id=2586 Description Accounting for Computer Machinists (ACM) has sufferred fr ...

  5. [转]Openstack Havana Dashboard测试和使用

    转贴一篇陈沙克老师的文章:http://www.chenshake.com/openstack-havana-dashboard-to-test-and-use/ Openstack Havana D ...

  6. 解决Nginx下WordPress后台404的问题

    在把这个博客做好后,上传到nginx服务器上却出现问题. 首先是wordpress官方的伪静态是通过.htaccess实现的,但nginx并不支持.htaccess,无奈只好在网上找到wordpres ...

  7. Android The content of the adapter has changed but ListView did not receive a notification终极解决方法

    这几天做一个自动扫描SD卡上所有APK文件的小工具,扫描过程中会把APK添加到LISTVIEW中显示,结果出现以下错误:(有时候触摸更新数据时候,触摸listview也会报错) E/AndroidRu ...

  8. OpenCV在Android平台上的应用

    今年8月份, OpenCV 2.3.1发布了. 虽然从2.2开始, OpenCV就号称支持Android平台, 但真正能让OpenCV在Android上运行起来还是在2.3.1版本上. 在这个版本上, ...

  9. MongoDB 安装和即基本操作

    http://www.mongodb.org/ Agile and Scalable MongoDB (from "humongous") is an open-source do ...

  10. PHP文件下载原理

    1.php下载原理图 2.文件下载源码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?php $ ...