Clairewd’s message ekmp
给两个串第一个串是翻译表(密文可以通过翻译表翻译成明文),第二个串是由密文+明文组成,前面是密文(完整的),后面是明文(未必完整),问能不能把第二个串补全,输出最短的一种可能。
一开始 用的string 和每次更新字符进行getnext
妥妥的 超时 kmp最好不要用string 速度太慢了
参考了 kuangbin的做法:
以s为原串做一次扩展KMP,得到extend数组,extend[i]表示原串以第i开始与模式串的前缀的最长匹配。经过O(n)的枚举,我们可以得到,若extend[i]+i=len且i>=extend[i]时,表示stringB即为该点之前的串,stringA即为该点之前的str串,最后输出即可。
就是原串和翻译后的串进行一次ekmp 然后进行判断输出即可
- #include<bits/stdc++.h>
- using namespace std;
- //input by bxd
- #define rep(i,a,b) for(int i=(a);i<=(b);i++)
- #define RI(n) scanf("%d",&(n))
- #define RII(n,m) scanf("%d%d",&n,&m)
- #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
- #define RS(s) scanf("%s",s);
- #define LL long long
- #define REP(i,N) for(int i=0;i<(N);i++)
- #define CLR(A,v) memset(A,v,sizeof A)
- //////////////////////////////////
- #define inf 0x3f3f3f3f
- #define N 100000+50
- int nex[N];
- int extend[N];
- char p[N];
- char s[N];
- char table[N];
- map<char,char>mp;
- void EKMP(char s[],char t[])//s[]为主串,t[]为模式串
- {
- int i,j,p,l;
- int len=strlen(t);
- int len1=strlen(s);
- memset(nex,,sizeof(nex));
- memset(extend,,sizeof(extend));
- nex[]=len;
- j=;
- while(j+<len&&t[j]==t[+j])j++;
- nex[]=j;
- int a=;
- for(int i=;i<len;i++)
- {
- p=nex[a]+a-;
- l=nex[i-a];
- if(i+l<p+)nex[i]=l;
- else
- {
- j=max(,p-i+);
- while(i+j<len&&t[i+j]==t[+j])j++;
- nex[i]=j;
- a=i;
- }
- }
- j=;
- while(j<len1&&j<len&&s[j]==t[j])j++;
- extend[]=j;
- a=;
- for(i=;i<len1;i++)
- {
- p=extend[a]+a-;
- l=nex[i-a];
- if(l+i<p+)nex[i]=l;
- else
- {
- j=max(,p-i+);
- while(i+j<len1&&j<len&&s[i+j]==t[j])j++;
- extend[i]=j;
- a=i;
- }
- }
- }
- int main()
- {
- int cas;
- RI(cas);
- while(cas--)
- {
- RS(table);
- RS(s);
- rep(i,,)
- mp[table[i]]='a'+i;
- int len=strlen(s);
- rep(i,,len-)
- p[i]=mp[ s[i] ];
- EKMP(s,p);
- int k;
- for(k=(len+)/;k<len;k++)
- {
- if(extend[k]+k>=len)//+k 意为当前坐标之前有几个字母 直接为k即可
- break;
- }
- rep(i,,k-)
- printf("%c",s[i]);
- rep(i,,k-)
- printf("%c",mp[s[i]]);
- cout<<endl;
- }
- return ;
- }
Clairewd’s message ekmp的更多相关文章
- hdu------(4300)Clairewd’s message(kmp)
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 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
http://acm.hdu.edu.cn/showproblem.php?pid=4300 很难懂题意.... Clairewd’s message Time Limit: 2000/1000 MS ...
- hdu4300 Clairewd’s message【next数组应用】
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- (KMP 扩展)Clairewd’s message -- hdu -- 4300
http://acm.hdu.edu.cn/showproblem.php?pid=4300 Clairewd’s message Time Limit: 2000/1000 MS (Java/Oth ...
- hdu4300 Clairewd’s message
地址:http://acm.hdu.edu.cn/showproblem.php?pid=4300 题目: Clairewd’s message Time Limit: 2000/1000 MS (J ...
- hdu 4300 Clairewd’s message 字符串哈希
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu4300 Clairewd’s message 扩展KMP
Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...
- Clairewd’s message
Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...
随机推荐
- 【原创】大数据基础之Flume(2)应用之kafka-kudu
应用一:kafka数据同步到kudu 1 准备kafka topic # bin/kafka-topics.sh --zookeeper $zk:2181/kafka -create --topic ...
- adb ( Android Debug Bridge)
adb ( Android Debug Bridge) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试应用. adb工具的工 ...
- 分页插件pagination.js
项目中有分页功能,之前都是自己写,样式不好看,功能也简单,就找了这个插件pagination.js 页面导入pagination.js html代码 <div class="list_ ...
- css3 自定义滚动条样式
::-webkit-scrollbar :滚动条整体部分 ::-webkit-scrollbar-thumb :滚动条里面的小方块样式 ::-webkit-scrollbar-track 滚动条的轨道 ...
- Android&Java面试题大全—金九银十面试必备
声明本文由作者:Man不经心授权转载,转载请联系原文作者原文链接:https://www.jianshu.com/p/375ad14096b3, 类加载过程 Java 中类加载分为 3 个步骤:加载. ...
- 使用 Jira 和 Confluence 6 在一起
这个过程是有趣的过程.请参考 Use Jira applications and Confluence together 文档来找到有关整合的相关内容,能够在后续的开发中更多的节省时间,以及你需要安装 ...
- java多线程快速入门(十九)
如何停止线程 1.使用stop方法强行终止线程(这个方法不推荐使用,可能会出现业务操作未执行完,线程中断了) package com.cppdy; class MyThread15 extends T ...
- doy09 文件处理,拷贝文件
一\在python中打开文件,得到文件语句并赋值给一个变量 f=open('a.txt','r',encoding='utf-8')) 默认打开模式就为r: 2.通过句柄对文件进行操作 data=f ...
- JavaScript(JS)之简单介绍
一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) N ...
- bzoj 4011
看了好多篇题解才看懂的题,我实在太菜了... 首先根据一个我不知道的算法,可以证明在没有加入新的边的时候,原图的所有生成树的方案数就是所有点(除1以外)的度之积 那么在新加入这条边之后,我们仍然可以这 ...