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 ...
随机推荐
- Python黑魔法 --- 异步IO( asyncio) 协程
python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...
- 苹果 icloud 把我 ipad min 所有照片丢失
苹果 icloud 把我 ipad min 所有照片丢失,大概发生在 '云上贵州' 之后! 发帖纪念--- 求个说法---
- ASP.Net Core 运行错误 Http Error 502.5 解决办法
Http Error 502.5 - Process Failure 如果你看到上面这张图片了的话,说明你在本地运行的时候报错了. 尤其好多都是我的群友,说下情况. 这个一般是本地的.NET Core ...
- Jmeter实例(一)_Beanshell脚本断言Mock接口
我们在做接口断言的时候,如果遇到复杂的json,可以考虑用beanshell脚本去解析list,同时加入自定义的断言 Mock例:https://www.easy-mock.com/mock/5cb4 ...
- Jvm 参数笔记
Jvm参数含义 https://cloud.tencent.com/developer/article/1129474 从一道题说起 https://blog.csdn.net/crazylzxlzx ...
- 基于 Django的Ajax实现 文件上传
---------------------------------------------------------------遇到困难的时候,勇敢一点,找同学朋友帮忙,找导师求助. Ajax Ajax ...
- H5 69-清除浮动方式四
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- UnderWater+SDN论文之四
Open Source Suites for Underwater Networking:WOSS and DESERT Underwater Source: IEEE Network, 2014 仿 ...
- Continued Fractions CodeForces - 305B (java+高精 / 数学)
A continued fraction of height n is a fraction of form . You are given two rational numbers, one is ...
- JVM原理分析
1 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收 ...