HDU 4300 Clairewd’s message(扩展KMP)

时间:2022-09-21 20:04:23

思路:extend[i]表示原串以第i開始与模式串的前缀的最长匹配。经过O(n)的枚举,我们能够得到,若extend[i]+i=len且i>=extend[i]时,表示t即为该点之前的串,c即为该点之前的str串,最后输出就可以。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int N=100010; char s[N],t[N];
char c[N];
int next[N],extand[N];
void getNext(int lt)
{
next[0]=lt;
int a=0;
while(a<lt-1&&t[a+1]==t[a]) a++;
next[1]=a;
a=1;
for(int k=2;k<lt;k++)
{
int p=a+next[a]-1;
int L=next[k-a];
if(k-1+L>=p)
{
int j=(p-k+1)>0? (p-k+1):0;
while(j+k<lt&&t[k+j]==t[0+j]) j++;
next[k]=j;
a=k;
}
else
next[k]=L;
}
} void getExtand(int ls,int lt)
{
getNext(lt);
int a=0;
int minLen=min(ls,lt);
while(a<minLen&&t[a]==c[a]) a++;
extand[0]=a;
a=0;
for(int k=1;k<ls;k++)
{
int p=a+extand[a]-1;
int L=next[k-a];
if(k-1+L>=p)
{
int j=(p-k+1)>0?(p-k+1):0;
while(j+k<ls&&j<lt&&t[j+k]==c[j]) j++;
extand[k]=j;
a=k;
}
else
extand[k]=L;
}
} int main()
{
int T;
cin>>T;
while(T--)
{
cin>>s>>t;
map<char,char> mmap;
int lt=strlen(t);
int ls=strlen(s);
for(int i=0;i<ls;i++)
mmap[s[i]]='a'+i;
for(int i=0;i<lt;i++)
c[i]=mmap[t[i]];
getExtand(lt,lt);
int i;
for(i=0;i<lt;i++)
{
if(i+extand[i]>=lt&&i>=extand[i])
break;
}
for(int j=0;j<i;j++) cout<<t[j];
for(int j=0;j<i;j++) cout<<c[j];
cout<<endl;
}
return 0; }

HDU 4300 Clairewd’s message(扩展KMP)的更多相关文章

  1. hdu 4300 Clairewd’s message&lpar;扩展kmp&rpar;

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

  2. hdu 4300 Clairewd’s message(kmp&sol;扩展kmp)

    题意:真难懂.. 给出26个英文字母的加密表,明文中的'a'会转为加密表中的第一个字母,'b'转为第二个,...依次类推. 然后第二行是一个字符串(str1),形式是密文+明文,其中密文一定完整,而明 ...

  3. HDU 4300 Clairewd&&num;39&semi;s message &lpar; 拓展KMP &rpar;

    题意 : 给你一个包含26个小写字母的明文密文转换信息字符串str,第一个表示'a'对应的密文是str[0].'b'对应str[1]……以此类推.接下来一行给你一个另一个字符串,这个字符串由密文+明文 ...

  4. hdu 4300 Clairewd’s message KMP应用

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

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

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

  6. hdu4300 Clairewd’s message 扩展KMP

    Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...

  7. hdu 4300 Clairewd’s message 字符串哈希

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

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

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

  9. HDU 4300 Clairewd’s message(扩展KMP)题解

    题意:先给你一个密码本,再给你一串字符串,字符串前面是密文,后面是明文(明文可能不完成整),也就是说这个字符串由一个完整的密文和可能不完整的该密文的明文组成,要你找出最短的密文+明文. 思路:我们把字 ...

随机推荐

  1. gradient color

    http://www.cnblogs.com/YouXianMing/p/3793913.html layer 不能自动autolay, 只能在viewDidLayout里面设置宽度 - (void) ...

  2. app缓存设计-文件缓存

    采用缓存,可以进一步大大缓解数据交互的压力,又能提供一定的离线浏览.下边我简略列举一下缓存管理的适用环境: 1. 提供网络服务的应用 2. 数据更新不需要实时更新,哪怕是3-5分钟的延迟也是可以采用缓 ...

  3. lintcode:装最多水的容器

    装最多水的容器 给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai).画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0).找到 ...

  4. PHP开发规范

    十.开发规范下面我们讲解 Yii 编程中推荐的开发规范.为简单起见,我们假设 WebRoot 是 Yii 应用安装的目录.1.URL默认情况下,Yii 识别如下格式的 URL: http://host ...

  5. wsdl自动生成Java代码,根据wsdl生成Java代码

    wsdl自动生成Java代码,根据wsdl生成Java代码 >>>>>>>>>>>>>>>>>&g ...

  6. hadoop2&period;2&period;0的WordCount程序

    package com.my.hadoop.mapreduce.wordcount; import java.io.IOException; import org.apache.hadoop.conf ...

  7. Vs2010 WPF 项目打包

    [转]图解WPF程序打包全过程 首先打开已经完成的工程,如图: 下面开始制作安装程序包. 第一步:[文件]——[新建]——[项目]——安装项目. 名称——可以自己根据要求修改. 位置——是指你要制作的 ...

  8. 统计numpy数组中最频繁出现的值

    arr = np.array([[1,2,100,4,5,6],[1,1,100,3,5,5],[2,2,4,4,6,6]]) 方法一: count = np.bincount(arr[:,2]) # ...

  9. c&num; word interop encrypt with password protect with password

    public static void EncryptWithPassword(string unEncryptedWordPath, string password) { Word.Applicati ...

  10. bash vim等常用命令

    生成的txt一不小心带了./,用vim: :%s/\.\/single/single #%s/xxx/yyy/g是全文本替换,这里用\将特殊字符.和/转换成普通字符 结果还不错: ---------- ...