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 ...
随机推荐
- Linux内存管理之mmap详解
转发之:http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux内存管理之mmap详解 一. mmap系统调用 1. mmap系统调用 ...
- 【强化学习】用pandas 与 numpy 分别实现 q-learning, saras, saras(lambda)算法
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10159331.html 特别感谢:本文的三幅图皆来自莫凡的教程 https://morvan ...
- 安卓权限申请处理框架Android-UsesPermission
安卓权限申请封装处理框架.测试支持4.0+.项目源于正式处理Android权限问题时,没找到简单.能满足被拒绝权限自动会到系统设置处理的框架,按自己的编程习惯造一个熟悉的轮子还是蛮好的.第一次使用An ...
- quartz获取缓存中所有运行中的Job
原文地址:https://blog.csdn.net/zzm8421/article/details/77769203 Quartz 2.1.5: public static void getAllJ ...
- Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
- Leetcode -- 258 数位相加
258. Given a non-negative integer num, repeatedly add all its digits until the result has only one d ...
- CONTINUE...?模拟分情况
CONTINUE...? DreamGrid has classmates numbered from to . Some of them are boys and the others are ...
- iOS NSDictionary JSON 相互转换
/*! * @brief 把格式化的JSON格式的字符串转换成字典 * @param jsonString JSON格式的字符串 * @return 返回字典 */ + (NSDictionary * ...
- Redis使用和部分源码剖析以及Django缓存和redis的关系
0.特点: a.持久化 b.单进程.单线程 c.5大数据类型 d.用于操作内存的软件. e.虽然是缓存数据库但是可以做持久化的工作 MySQL是一个软件,帮助开发者对一台机器的硬盘进行操作 ...
- MySQL 日期类型函数及使用
1 MySQL 数据库中有五种与日期时间有关的数据类型,各种日期数据类型所占空间如下图所示: 2 datetime 与 date datetime 占用8字节,是占用空间最多的一种日期格式.它显示日期 ...