题目大意是有一份文件,前面是密文,后面是原文,但那个人接到这个文件后不知道中间从哪里开始是原文,所以你要帮忙还原一下,如果后面原文比密文少,你就将它补全

字符串长度范围是100000如果是爆搜,n^2一定超时的没话说,但我比赛的时候好像是让驴踢了,套一层for循环枚举中间值,然后kmp,那kmp还不如暴力快了呢!!而且时间复杂都还是n^2,啊!!太缺了,将线段a以中间为标记分成两个数组前一半tay和后一般tey,在将tey后面添上一个len长度的‘*',作为标记,然后一tay为模式串,tey为原串,kmp其中‘*’就是万能匹配符,之后的mid+kmp(tay,tey)就是密文长度!!

#include<iostream>
#include<string.h>
#include<cstdio>
#include<memory>
using namespace std;
#define N 100005
char a[N*3],b[30],tey[N*3],tay[N*3],len;
int pa[30],next[N*3];
void prenext(char str[]){int j=-1,i;next[0]=-1;int len1=strlen(str);for(int i=1;i<len1;i++){while(j>=0&&str[j+1]!=str[i])j=next[j];if(str[j+1]==str[i])j++;next[i]=j;}
}
int kmp(char str[],char str1[]){int j=-1;int len1=strlen(str1);for(int i=0;str[i];i++){while(j>=0&&str1[j+1]!=str[i]&&str[i]!='*')j=next[j];if(str1[j+1]==str[i]||str[i]=='*')j++;if(j==len1-1)return i-j;}return 0;
}
int main(){
//    freopen("in.txt","r",stdin);int n;scanf("%d",&n);while(n--){int sign=0;scanf("%s%s",b,a);for(int i=0;b[i];i++)pa[b[i]-'a']='a'+i;int len=strlen(a);int mid=(len+1)/2;for(int i=0;i<mid;i++){tay[i]=pa[a[i]-'a'];}tay[mid]=0;int j=0;for(int i=mid;i<len;i++,j++)tey[j]=a[i];for(;j<=2*len;j++)tey[j]='*';tey[j]=0;prenext(tay);int t=mid+kmp(tey,tay);for(int i=0;i<t;i++)printf("%c",a[i]);for(int i=0;i<t;i++)printf("%c",pa[a[i]-'a']);cout<<endl;}return 0;
}

hdu 4300 Clairewd’s message kmp匹配! 多校联合赛第一题相关推荐

  1. HDU - 4300 Clairewd’s message(扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串 s 和 t ,字符串 s 代表着一种密码的映射,字符串 t 代表着一段密文+明文,题目保证密文是完整的,但明文只有一部分,现在问如何补全字符串 t ,使得 ...

  2. HDU 4300 Clairewd’s message

    一道KMP的变式 本题仍是求最大前缀后缀,所以仍用KMP,但不同的是,本题有一个密码转换规则,不过好在题目中说了两段不重合,那么我们就可以在中间插入一个特殊符号'*'',保证求next数组时不会越过中 ...

  3. Detection of Extraterrestrial KMP匹配 重复k次子串 好题

    一开始以为这道题是后缀数组,想了好久没想明白怎么做,后来发现暴力枚举起点,进行KMP就好了. 枚举起点以后,构建fail数组. 遍历fail数组,如果串s[l,r]是由串s[s,t]重复k次得到的,那 ...

  4. HDU 5734 Acperience (公式推导) 2016杭电多校联合第二场

    题目:传送门. #include <iostream> #include <algorithm> #include <cstdio> #include <cs ...

  5. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)

    磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add  把d加到第k个数上去 2 ...

  6. HDU多校联合赛(1007 Magical Forest)模拟题

    题目: Problem Description There is a forest can be seen as N * M grid. In this forest, there is some m ...

  7. HDU 5454 Excited Database (2015年沈阳赛区网络赛E题)

    1.题目描述:点击打开链接 2.解题思路:本题利用线段树解决,根据题意,我们需要建立两棵线段树,分别维护主对角线,副对角线.每个线段树的结点需要维护sum,sumL,sumR,其中,sum表示当前区间 ...

  8. HDU/HDOJ 4043 BUPT 235 FXTZ II 2011ACM北京网络赛 D题

    FXTZ II Accept:15     Submit:28 Time Limit:1000MS     Memory Limit:65536KB Description Cirno is play ...

  9. HDU 3220 Alice’s Cube (09年上海区域赛水题(位压缩、逆向搜索、打表))

    这道题是09年上海区域赛的A题,虽然很水,但是不能直接爆搜,直接爆搜要T.于是我们看到题目的要求是说当操作的步数大于3的时候就输出more,那么我们可以从终态枚举进行了三次操作所能达到的所有状态,这个 ...

  10. HDU 5130 Signal Interference (2014年广州赛区现场赛D题)

    1.题目描述:点击打开链接 2.解题思路:根据题意,P点轨迹构成了一个圆,即著名的阿波罗尼斯圆,接下来的任务就是求解圆和多边形相交区域的面积了,直接用模板解决. 3.代码: #include<i ...

最新文章

  1. 一个在raw里面放着数据库文件的网上例子
  2. EOS Chain/Wallet RPC API的PHP开发包
  3. 推荐一款好工具:16进制字节搜索工具 C#的效率
  4. BERT在多模态领域中的应用
  5. python函数参数的作用是_python函数参数理解
  6. 16-就业课(2.1)-应用容器-Docker
  7. 正则表达式——获取指定IP的物理地址(二)
  8. java调用远程主机shell_Java 执行远程主机shell命令代码
  9. 练习题 - 基于快速文本标题匹配的知识问答实现(一,基础篇)
  10. HDU 4859 海岸线(最大流最小割)
  11. Linux下安装jdk报Permission denied以及chmod详解
  12. 组态王历史记录用access_Access数据库与表在 组态王中使用.ppt
  13. java编程简单小游戏_求一个简单又有趣的JAVA小游戏代码
  14. Web-Coration
  15. 简单举例JAVA回调函数的实现
  16. 微信小程序 组件传值(一) properties 父传子
  17. 多行文字cad提取数据_利用CAD自带的数据提取功能手动提取假表格至Excel
  18. UIAlertView/UIAlertController封装使用
  19. 内功图说--十二段锦
  20. DWG中注记平移问题

热门文章

  1. linux搭建一个配置简单的nginx反向代理服务器 2个tomcat
  2. swing简单的打字游戏源码
  3. 跑通LSD-SLAM
  4. 自定义 Cordova插件(基础篇)
  5. httpSession和Cookie
  6. jquery easyui里datagrid用法记录
  7. 执行pip命令时遇到 Fatal error in launcher: Unable to create process using ''
  8. Linux新手必看:浅谈如何学习linux
  9. 安装Ubuntu的那些事儿(续)
  10. 面向对象相关知识及常用操作(二)