jzoj 2937_监听还原_KMP

题目描述

Alice和Bob正在悄悄地给对方发信息,信息都是由英文小写字母组成的,他们约定,所有的字母都得经过一个字母表进行变换,以防泄漏。另一方面John却在监听。

John发现,Alice和Bob通信的时候,总是先发送加密后的密文,然后紧接着发送原文。

但是Alice和Bob似乎也意识到了似乎有人监听,有时候会随意中断了他们的通信。不过每次都是在发送完密文之后才停止传送的。也就是说,John截获到的信息是密文的全文以及前一部分原文。原文可能一个字符都没有,也可能原文的全文都被截获。

现在John比较头疼,他虽然已经得到了他们两个人通信的加密字母表,但是分不清楚什么地方是密文和明文的分界线。你能帮他还原回完整的传输内容吗?

如果有多种可能时,John认为那个最短的信息才是原始的。


思路

这题就是一个纯暴力,但我用了KMP来暴力

这题的题目很难读懂

这题正解是用KMP中的next数组直接一次出解

俗话说:带break的暴力都是正解


#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
char a[30], s[1000005], b[30];
int p[1000005];
int main()
{
    scanf("%s", a);
    for (int i = 0; i < 26; i++)
    {
        b[a[i] - ‘a‘] = char(i + ‘a‘);
    }
    scanf("%s", s);
    int len = strlen(s);
    int j = -1;
    for (int i = 1; i < (len + 1) / 2; i++)
    {
        if (s[i] != s[j + 1] && j != -1) j = p[j];
        if (s[i] == s[j + 1]) j++;
        p[i] = j;
    }
    for (int i = 0; i < (len + 1) / 2; i++)
    {
        cout << s[i];
    }
    for (int i = (len + 1) / 2; i <= len; i++)
    {
        int jj = -1;
        int fl = 0;
        for (int ii = i; ii < len; ii++)
        {
            if (a[s[ii] - ‘a‘] != s[jj + 1] && jj != 0)
            {
                break;
                jj = p[jj];
            }
            if (a[s[ii] - ‘a‘] == s[jj + 1]) jj++;
            if (jj == len - i - 1)
            {
                fl = 1;
                break;
            }
        }
        if (fl || i == len)
        {
            for (int ii = 0; ii < i; ii++)
            {
                cout << b[s[ii] - ‘a‘];
            }
            break;
        }
        cout << s[i];
        if (s[i] != s[j + 1] && j != -1) j = p[j];
        if (s[i] == s[j + 1]) j++;
        p[i] = j;
    }
}
时间: 2024-10-14 06:47:48

jzoj 2937_监听还原_KMP的相关文章

oracle 监听服务自动停止与无法启动问题

描述:监听服务莫名其妙终止,必须手动启动. 网上关于该问题的资料很多,总结下来,有以下几点 1.地址使用了主机名,修改Host文件和监听文件即可解决该问题. 2.防火墙作怪. 3.安全软件的优化功能作怪. 4.环境变量有问题 但是,我们这边的情况比较复杂,在尝试关闭防火墙,修改host文件等,还原优化选项,查看环境变量等操作之后,仍有主机出现该问题. 分析:1.不是所有主机都会产生该问题,大致先排除服务器问题,2.可能某些网络原因导致监听服务停止.3.系统方面导致的该问题.因为该问题具有随机性,

android-----关于通过AIDL注册监听之后无法解除监听的探索

我们在平常使用AIDL时可能会有这样的场景,客户端并不想一直查看服务端有没有有关我的消息,而是想让服务端在有消息的时候能够通知我,随后客户端再去服务端拿消息,这样相对来说比较节省资源,通常我们可以利用观察者模式将客户端注册到服务端,接着有消息的时候服务端相应的通知各个客户端就可以了,这种方式在客户端和服务端处于同一进程的时候使用是没有问题的,因为同一进程内部是可以直接传递对象的,并不会出现注册绑定到服务端和解注册的对象不同的情况,但是如果放到不同进程间的话,因为通信过程中涉及到了序列化反序列化过

Ogre 监听类与渲染流程

Ogre中有许多监听类,我们可以简单理解成C#中的事件,这些类作用都不小,说大点可能改变流程,说小点修改参数等,下面列举一些常用的监听类. FrameListener:由Ogre中的Root负责维护,主要针对所有RenderTarget监听 frameStarted:在一桢开始的时候,所有RenderTarget更新之前. frameRenderingQueued:所有RenderTarget更新之后,但是还没交换缓冲区.(意思屏幕上显示没变) frameEnded:所有RenderTarget

c#网络通信框架networkcomms内核解析之五 数据监听

在networkcomms中,服务器端可以同步监听数据,也可以异步监听数据. 以开源的networkcomms.2.31为例 服务器端监听代码: protected override void StartIncomingDataListen() { if (!NetworkComms.ConnectionExists(ConnectionInfo.RemoteEndPoint, ConnectionType.TCP)) { CloseConnection(true, 18); throw new

oracle服务起不来以及无法监听问题解决

改问题是在搭建起一个很早之前的数据库的时候碰见的,虽然这个问题网上已经有很多相关的帖子,但因最近碰见多次这样的问题,特此简单记录: 1.最开始碰见的问题是:The listener supports no services 之前的记录没有存,借用其他贴相似错误:   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracke11g)(PORT=1521)))  --这里标红的是借用帖子的Host,实际是从本地解析出来的,最后错误也是从这里定位的   (DES

监听Touch事件自定义属性实现Selector

先看效果图,点击事件触发时背景变化,一般都是通过selector标签实现的.但是当我们经常要使用到的时候,我们想直接在布局文件中设置两个背景资源,点击时候一个,默认情况下一个,这样就很直观的在布局文件中看出来,而不需要建立大量的selector来实现. 这样的效果当然可以使用android:background设置一个Selector背景,但是这里不是.这里仅仅是自定义一个button. <com.example.view.ButtonSelect android:id="@+id/but

一台Oracle数据库服务器上两个监听同时使用

记得之前Oracle原厂的工程师在例行检查时发现一台Oracle数据库服务器的上启动了两个监听,分别监听的是1521和1581端口,而且两个端口都在用,当时当作一个比较奇怪的现象,没有能理解原因是什么.最近几天在看Oracle网络配置的文档,无意间在虚拟机上启动了两个监听,就又想起了之前的问题.到底是因为什么原因呢? 下面先来还原一下整个过程. 当时是在做配置静态监听的练习,在listener.ora中配置了一个静态监听: ORCL =   (DESCRIPTION=     (ADDRESS_

基于Lua插件化的Pcap流量监听代理

1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的输入数据流.我们如果不在IDS上看应用的服务,可以直接针对服务所在服务位置,针对应用端口进行,有针对性的监听分析. Tshark和tcpdump.windump这些监听工具提供了比较丰富的命令行参数来监听流量数据.wireshark.burpsuite这些工具也提供相应的lua.python脚本的机

Fragment-如何监听fragment中的回退事件与怎样保存fragment状态

一.如何监听Fragment中的回退事件 1.问题阐述 在Activity中监听回退事件是件非常容易的事,因为直接重写onBackPressed()函数就好了,但当大家想要监听Fragment中的回退事件时,想当然的也想着重写onBackPressed()方法,这时候你会发现:Fragment中根本就没有onBackPressed()方法给你重写.这可怎么破! 想想,在前面的例子中,我们在Activity的一个fragment_container里依次Add进fragment1,fragment