题意:乱七八糟说了一大堆,就是先给你一个长度26的字符串,对应了abcd....xyz,这是一个密码表。然后给你一个字符串,这个字符串是不完整的(完整的应该是前半部分是加密的,后半部分是解密了的),然而,给你的字符串一定是加密的部分+一部分解密的部分(可以是全部,也可以是没有),让你求出最短的完整字符串;

解题思路:考虑给出的字符串加密部分一定全部给出,所以,给出的字符串的一半一定是加密的,所以把这一半先转换好,然后和后缀比一下,求最长的公共前缀,用kmp和拓展kmp都行;

拓展kmp(这里要注意下,如果用这个,那么一定公共前缀一定要等于后缀,也就是next[i]+i>len)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#define maxn 100500
using namespace std;
char t[maxn];
char word[maxn];
char ans[maxn];
char s[maxn];
int _next[maxn];
int tlen;
void get_next()
{
int i=0,j,po;
_next[0]=tlen;
while(t[i]==t[i+1]&&i+1<tlen)
i++;
_next[1]=i;
po=1;
for(int i=2;i<tlen;i++)
{
if(_next[i-po]+i<_next[po]+po)
_next[i]=_next[i-po];
else
{
j=_next[po]+po-i;
if(j<0)
j=0;
while(i+j<tlen&&t[j]==t[j+i])
j++;
_next[i]=j;
po=i;
}
}
}
int main()
{
int tt;
int y;
scanf("%d",&tt);
word[0]='a';
for(int i=1;i<26;i++)
word[i]=word[i-1]+1;
while(tt--)
{
map<char,char>m;
scanf("%s",ans);
scanf("%s",t);
for(int i=0;i<26;i++)
{
m[ans[i]]=word[i];
}
int len=strlen(t);
for(int i=0;i<len;i++)
s[i]=t[i];
tlen=len;
len=len/2;
if(tlen%2==1)
len++;
for(int i=0;i<len;i++)
{
t[i]=m[t[i]];
}
get_next();
int maxx=0;
for(int i=len;i<tlen;i++)
{
if(_next[i]+i>=tlen)
maxx=max(maxx,_next[i]);
}
//cout<<maxx<<endl;
int slen=tlen-maxx;
for(int i=0;i<slen;i++)
{
cout<<s[i];
}
for(int i=0;i<slen;i++)
{
cout<<m[s[i]];
}
cout<<endl;
}
}

 kmp:(用·这个就要注意aaa这种情况,就是前后缀重叠了)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#define maxn 100500
using namespace std;
char t[maxn];
char ans[maxn];
char word[maxn];
char s[maxn];
int next1[maxn];
int tlen;
void get_next()
{
int j=0,k=-1;next1[0]=-1;
while(j<tlen)
{
if(t[j]==t[k]||k==-1)
next1[++j]=++k;
else
k=next1[k];
}
}
int main()
{
int tt;
word[0]='a';
for(int i=1;i<26;i++)
word[i]=word[i-1]+1;
cin>>tt;
while(tt--)
{
map<char,char>m;
cin>>ans;
cin>>t;
for(int i=0;i<26;i++)
{
m[ans[i]]=word[i];
}
int len=strlen(t);
for(int i=0;i<len;i++)
s[i]=t[i];
tlen=len;len=len/2;
if(tlen%2==1)
len++;
for(int i=0;i<len;i++)
{
t[i]=m[t[i]];
}
get_next();
int maxx=next1[tlen];
if(maxx>tlen/2)
maxx=tlen/2;
int slen=tlen-maxx;
for(int i=0;i<slen;i++)
cout<<s[i];
for(int i=0;i<slen;i++)
cout<<m[s[i]];
cout<<endl;
}
}

  

hdu-4300(kmp或者拓展kmp)的更多相关文章

  1. HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )

    题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问 ...

  2. HDU 6153 A Secret ( KMP&&DP || 拓展KMP )

    题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...

  3. hdu 4300 Clairewd’s message KMP应用

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

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

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

  5. poj-2752(拓展kmp)

    题意:求一个串所有的前后缀字串: 解题思路:kmp和拓展kmp都行,个人感觉拓展kmp更裸一点: 拓展kmp: #include<iostream> #include<algorit ...

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

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

  7. HDU 4300 Clairewd's message ( 拓展KMP )

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

  8. hdu 4300 拓展kmp

    题目大意: 输入样例个数,每个样例有两行,第一行是26个字母,分别代表a~z加密后的密文:第二行代表一串密文+明文,密文一定是完整的,但明文可能不完整,让你输出最短的(密文+明文): 基本思路: 拓展 ...

  9. HDU - 3613 Best Reward(manacher或拓展kmp)

    传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...

随机推荐

  1. bernoulli数

    LL B[N][],C[N][N],f[N][]; int n,m; LL gcd(LL a,LL b){return b?gcd(b,a%b):a;} LL lcm(LL a,LL b){retur ...

  2. JVM内存管理的一些思考

    目录 一. 内存是怎么分配的 二. 方法区 三. java对象的生命周期 四. Class对象是在方法区还是堆中 五.java对象的大小 六. 类加载的初始化阶段 七.Class.forName和Cl ...

  3. SCOI2019d1t1平台跳跃[高精]

    分析 首先考虑相邻柱子之间没有浮台. 记前 \(m-1\) 个盘子为 x, 第 \(m\) 个盘子为 y,有如下过程:\(x\rightarrow C, y\rightarrow B, x\right ...

  4. 自己制作Chrome便携版实现多版本共存

    本文只针对Windows下的Chrome浏览器的使用. 有时候我们需要使用老版本Chrome,或者仅仅体验一下最新版. 上古时代有IETester用来测试多个IE版本,和本机的IE不冲突. Chrom ...

  5. .net core jwt

    https://www.cnblogs.com/JacZhu/p/6837676.html

  6. Mysql安装(Ubuntu)

    卸载方法一: --删除mysql的数据文件 sudo rm /var/lib/MySQL/ -R --删除mysql的配置文件 sudo rm /etc/mysql/ -R --自动卸载mysql(包 ...

  7. POJ 2406 Power Strings(KMP)

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

  8. Mike and palindrome CodeForces - 798A

    题目链接 一个简单的题目,但是却很少有人可以一次AC,比如我就瞎写wa了一次... 写本博算个教训录吧. 题目给出一个字符串,让你严格的改变一个字符使改变后的字符串是一个回文串. 回文串不用解释了.不 ...

  9. 关于js作用域问题

    补充: function Foo(name,age){ this.name=name; this.age=age; this.getName=function(){ console.log(this) ...

  10. 【学习总结】Git学习-参考廖雪峰老师教程八-使用GitHub

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...