hdu 4300 拓展kmp
题目大意:
输入样例个数,每个样例有两行,第一行是26个字母,分别代表a~z加密后的密文;第二行代表一串密文+明文,密文一定是完整的,但明文可能不完整,让你输出最短的(密文+明文);
基本思路:
拓展kmp,因为密文是完整的,所以它的长度必然是一半以上,所以把前一半转换成明文放到另一个数组里,然后后半部分原封不动的放到该数组里,然后拓展kmp,求一下next,然后从一半以后一直往后找,找到的话,就跳出,然后基本把把问题解决了;
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 100000+10; int nx[maxn],ex[maxn];
char S[maxn],T[maxn];
char s1[maxn],a[27],b[27];
int lent,lens;
void getNext(){
nx[0]=lent;
int j=0;
while(j+1<lent&&T[j]==T[j+1]) j++;
nx[1]=j;
int k=1;
for(int i=2;i<lent;i++){
int p=k+nx[k]-1;
int l=nx[i-k];
if(i+l<p+1) nx[i]=l;
else{
j=max(0,p-i+1);
while(i+j<lent&&T[i+j]==T[j]) j++;
nx[i]=j;
k=i;
}
}
}
/*
void exkmp(){
int j=0;
while(j<lens&&j<lent&&S[j]==T[j]) j++;
ex[0]=j;
int k=0;
for(int i=1;i<lens;i++){
int p=k+nx[k]-1;
int l=nx[i-k];
if(l+i<p+1) ex[i]=-l;
else{
j=max(0,p-i+1);
while(i+j<lens&&j<lent&&S[i+j]==T[j]) j++;
ex[i]=j;
k=i;
}
}
}
*/
int main(){
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%s%s",a,s1);
for(int i=0;i<26;i++) b[a[i]-'a']=i+'a';
int len=strlen(s1);
for(int i=0;i<(len+1)/2;i++) T[i]=b[s1[i]-'a'];
for(int k=(len+1)/2;k<=len;k++) T[k]=s1[k];
lent=strlen(T);
getNext();
int k;
for(k=(len+1)/2;k<len;k++){
if(nx[k]==len-k) break;
}
printf("%s",s1);
for(int i=len-k;i<k;i++) printf("%c",b[s1[i]-'a']);
printf("\n");
}
return 0;
}
hdu 4300 拓展kmp的更多相关文章
- HDU 6153 拓展KMP (2017CCPC)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- HDU - 4300 Clairewd’s message (拓展kmp)
HDU - 4300 题意:这个题目好难读懂,,先给你一个字母的转换表,然后给你一个字符串密文+明文,密文一定是全的,但明文不一定是全的,求最短的密文和解密后的明文: 题解:由于密文一定是全的,所以他 ...
- HDU 4300 Clairewd's message ( 拓展KMP )
题意 : 给你一个包含26个小写字母的明文密文转换信息字符串str,第一个表示'a'对应的密文是str[0].'b'对应str[1]……以此类推.接下来一行给你一个另一个字符串,这个字符串由密文+明文 ...
- HDU - 3613 Best Reward(manacher或拓展kmp)
传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...
- hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)
传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...
- HDU 3613 Best Reward(拓展KMP算法求解)
题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...
- Simpsons’ Hidden Talents HDU - 2594(拓展kmp)
Sample Input clinton homer riemann marjorie Sample Output 0 rie 3 看输出才题意...拓展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 ...
随机推荐
- cglib代理与jdk动态代理示例
先看基于jdk实现的动态代理实现例子 1.先声明一个接口类 public interface UserService{ public String getName(String msg); } 2.实 ...
- permutations and combinations
# import itertools # # my_list = [1, 2, 3, 4, 5, 6] # # combinations = itertools.combinations(my_lis ...
- 百度语音 python
python实现语音识别 我们用到是百度语音识别,因为不掏钱哈哈!首先去百度官网去创建你的 APPID AK SK 这个网上很多大家没创建的自己看下 目前本SDK的功能同REST API,需要联网调用 ...
- django 邮箱发送
在django中提供了邮件接口 QQ邮箱配置 qq邮箱地扯:https://mail.qq.com settings文件 # 邮箱配置 EMAIL_USE_SSL = True EMAIL_HOST ...
- mui使用总结
mui是一个高性能的HTML5开发框架,从UI到效率,都在极力追求原生体验:这个框架自身有一些规则,刚接触的同学不很熟悉,特总结本文:想了解mui更详细的信息,请访问mui官网 DOM结构 关于mui ...
- bzoj 3251
http://www.lydsy.com/JudgeOnline/problem.php?id=3251 这道题在北京八十中的时候有人讲过.. 不过由于自己continue 写掉了一个所以调了很久. ...
- hdu 6103 Kirinriki (枚举对称中心+双指针)
Problem Description We define the distance of two strings A and B with same length n isdisA,B=∑(i=0 ...
- WebView中shouldOverrideUrlLoading和onPageStarted方法的区别
WebView中的shouldOverrideUrlLoading和onPageStarted这两个方法就是可以捕获到跳转的url,然后进行一系列的操作,但是他们两到底有什么区别呢? 当点击页面中的链 ...
- 用 GetEnvironmentVariable 获取常用系统环境变量
以前曾用 GetWindowsDirectory.GetSystemDirectory.GetTempPath 等函数获取系统常用文件夹; 也用过 SHGetSpecialFolderLocation ...
- POJ 3904 (莫比乌斯反演)
Stancu likes space travels but he is a poor software developer and will never be able to buy his own ...