hdu-4300(kmp或者拓展kmp)
题意:乱七八糟说了一大堆,就是先给你一个长度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)的更多相关文章
- HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )
题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问 ...
- HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...
- hdu 4300 Clairewd’s message KMP应用
Clairewd’s message 题意:先一个转换表S,表示第i个拉丁字母转换为s[i],即a -> s[1];(a为明文,s[i]为密文).之后给你一串长度为n<= 100000的前 ...
- HDU 4300 Clairewd’s message(KMP+思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300 题目大意:题目大意就是给以一段字符xxxxzzz前面x部分是密文z部分是明文,但是我们不知道是从 ...
- poj-2752(拓展kmp)
题意:求一个串所有的前后缀字串: 解题思路:kmp和拓展kmp都行,个人感觉拓展kmp更裸一点: 拓展kmp: #include<iostream> #include<algorit ...
- HDU - 4300 Clairewd’s message (拓展kmp)
HDU - 4300 题意:这个题目好难读懂,,先给你一个字母的转换表,然后给你一个字符串密文+明文,密文一定是全的,但明文不一定是全的,求最短的密文和解密后的明文: 题解:由于密文一定是全的,所以他 ...
- HDU 4300 Clairewd's message ( 拓展KMP )
题意 : 给你一个包含26个小写字母的明文密文转换信息字符串str,第一个表示'a'对应的密文是str[0].'b'对应str[1]……以此类推.接下来一行给你一个另一个字符串,这个字符串由密文+明文 ...
- hdu 4300 拓展kmp
题目大意: 输入样例个数,每个样例有两行,第一行是26个字母,分别代表a~z加密后的密文:第二行代表一串密文+明文,密文一定是完整的,但明文可能不完整,让你输出最短的(密文+明文): 基本思路: 拓展 ...
- HDU - 3613 Best Reward(manacher或拓展kmp)
传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...
随机推荐
- 洛谷 P1451 求细胞数量
题目链接 https://www.luogu.org/problemnew/show/P1451 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字 ...
- 在windows下安装Redis
一.下载windows版本的Redis 由于官网上没有windows版的下载地址,所以需要下载windows版本的Redis有以下两个地址: 博主的csdn资源地址:http://download.c ...
- 深入理解Java中的反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- 消息队列工具类(MSMQ)
所要做的是简化msmq的调用代码以及做到可替代性,实现后,调用消息队列代码变为如下所示: QueueService srv = QueueService.Instance(); //检查存储DTO1的 ...
- Asp.Net Core实战(干货)
序言 使用.NET Core,团队可以更容易专注的在.net core上工作.比如核心类库(如System.Collections)的更改仍然需要与.NET Framework相同的活力,但是ASP. ...
- Bootstrap 栅格 样式 组件 插件
-----------------------------起先是我们造成习惯,后来是习惯造成我们. day 51 Bootstrap 官方网站: bootcss.com/ <!DOCTYP ...
- 容器互联(linking)
容器互联(linking)是一种让多个容器中的应用进行快速交互的方式. 它会在源和接受容器中间创建连接关系,接受容器可以通过容器名快速访问到源容器而不用指出具体的IP地址.
- Python—函数的名称空间
名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方 名称空间共3种, ...
- html总结:固定表格中单元格宽度
当然要提前设置好table的width值,然后再写这个,使得每列宽度都相等. <style> table { table-layout: fixed; } </style>
- 【学习总结】GirlsInAI ML-diary day-4:变量/Variable
[学习总结]GirlsInAI ML-diary 总 原博github链接-day4 变量/Variable 变量是计算机编程中一个很基础的概念,在计算机程序中,variables are reser ...