首页 > 其他分享 >[lnsyoj2232]永恒

[lnsyoj2232]永恒

时间:2024-08-02 19:06:00浏览次数:13  
标签:int sum ne 日期 枚举 永恒 lnsyoj2232 31

题意

给定一个由小写字母和数字组成的字符串 \(s\),给定 \(n\) 个模式串 \(t\),对第 \(i\) 个字符串 \(t_i\),使得字符串 \(s\) 满足:删除其中任意多个字符,使 \(s\) 形式为 T + Date,其中,T 为模式串 \(t_i\),Date 为任意一个真实存在的日期。求对于每一个 \(t_i\),求满足条件的 \(s\) 的个数的和

赛时 70PTS

由于我们要让 \(t_i\) 尽可能靠前,Date 尽可能靠后,因此我们可以先扫描出 \(t_i\) 的末尾位置 \(ed\),然后枚举所有可能的日期(日期可以预处理),判断哪个日期存在于 \(ed\) 后的数字串中。

日期预处理

我们可以提前手打出每个月的天数,然后分别枚举月份和日期,并将月份和日期拼接起来,组合成一个 MMDD 形式的日期,最后存储起来。

赛后

参考赛时的思路,我们需要一种快速的方法查找出 \(ed\) 和判断是否有某个日期存在。
由于只需要找到位置就可以了,所以我们可以预处理出一个二维数组 \(ne_{i, c}\),表示第 \(i\) 个字符后面的第一个字符 \(c\) 的位置,若不存在则为 \(-1\),特别地,\(ne_{0,c}\) 表示第一个字符 \(c\) 的位置。
这个数组可以从后面开始递推:显然 \(ne_{len(s),c}\) 的值一定为 \(-1\)。当枚举到第 \(i\) 项时,显然,\(ne_{i,s_{i+1}}\) 的值为 \(i + 1\),而 \(ne_{i,c}(c\ne s_{i+1})\) 值为 \(ne_{i + 1,c}\),可以递推。
当我们查找 \(ed\) 时,我们就可以从 \(ne_{0,s_{1}}\) 开始向后查找,时间复杂度就被压缩到了 \(O(len(t_i))\)
但我们无法在每一个 \(t_i\) 中都进行一次合法日期的枚举,因此,我们仍需要预处理这一段。由赛时思路得,Date 应尽可能靠后。因此,我们提前枚举出所有合法日期的开头最靠后的位置,并记录下每个位置的合法日期的个数(每个日期只计算一次)。这样,只需要一个后缀和就可以 \(O(1)\) 的查询所有合法的 Date 了。
为了快速的枚举,我们需要另一个二维数组 \(pre_{i,c}\),表示第 \(i\) 个字符前面的第一个字符 \(c\) 的位置,若不存在则为 \(-1\),特别地,\(ne_{len(s) + 1, c}\) 表示最后一个字符 \(c\) 的位置。由于定义是和 \(ne\) 完全相反的,因此预处理方式也与 \(ne\) 完全相反,这里不再赘述。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

const int N = 100005;

int days[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int T;
int n, m;
vector<string> dates;
string s, name;
int ne[N][128];
int pre[N][128];
int sum[N];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    for (int i = 1; i <= 12; i ++ ) 
        for (int j = 1; j <= days[i]; j ++ ){
            string date = "    ";
            date[0] = i / 10 + '0';
            date[1] = i % 10 + '0';
            date[2] = j / 10 + '0';
            date[3] = j % 10 + '0';
            dates.push_back(date);
        }

    cin >> T;

    while (T -- ){
        memset(sum, 0, sizeof sum);
        cin >> n >> m;
        cin >> s;
        s = ' ' + s;

        memset(ne[m], -1, sizeof ne[m]);
        for (int i = m - 1; i >= 0; i -- ){
            for (int j = 0; j < 128; j ++ )
                ne[i][j] = ne[i + 1][j];
            ne[i][s[i + 1]] = i + 1;
        }

        memset(pre[1], -1, sizeof pre[1]);
        for (int i = 2; i <= m + 1; i ++ ){
            for (int j = 0; j < 128; j ++ )
                pre[i][j] = pre[i - 1][j];
            pre[i][s[i - 1]] = i - 1;
        }

        for (string date : dates){
            int j = m + 1;
            for (int k = date.size() - 1; k >= 0 && j != -1; k -- ) j = pre[j][date[k]];
            if (j != -1) sum[j] ++ ;
        }
        for (int i = m; i; i -- ) sum[i] += sum[i + 1];
        int ans = 0;
        for (int i = 1; i <= n; i ++ ){
            cin >> name;
            int j = 0;
            for (int i = 0; i < name.size() && j != -1; i ++ ) j = ne[j][name[i]];
            ans += sum[j];
        }

        cout << ans << '\n';
    }
    return 0;
}

标签:int,sum,ne,日期,枚举,永恒,lnsyoj2232,31
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj2232

相关文章

  • 永恒之蓝漏洞复现
    永恒之蓝漏洞复现漏洞背景:永恒之蓝(ms17-010)爆发于2017年4月14日晚,是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限,以此来控制被入侵的计算机。甚至于2017年5月12日,不法分子通过改造“永恒之蓝”制作了wannacry勒索病毒,使全世界大范围内遭受了该勒索病毒,甚至波及......
  • 永恒之蓝 MS17-010漏洞复现
    注意:使用Kali机为攻击机,被攻击电脑为win7系统的虚拟机,关闭防火墙扫描端口启动模块查询并使用第一个那个设置攻击负载,设置被攻击的ip,设置攻击者kaliiprun启动等待一下,当显示WIN的时候就是说明已经获得了对方的shell控制权限此时就是获得了一个meterpreter会......
  • 传奇永恒的单机版下载地址
    我是学霸传奇永恒https://f9a5o6xqpg.feishu.cn/docx/ZbnBdTtNdoecKcxsMDocIWIanIg我是学霸君分享的游戏地址.这里面270期就是传奇永恒的下载地址.我玩了一下挺好的.设置里面可以设置自动打怪和释放技能.更多内容可以搜我是学霸君的qq群,那里面游戏更多.......
  • [附源码]新天龙八部3永恒经典之江山策仿官方_联网+单机搭建架设教程
    新天龙八部3永恒经典之江山策仿官_联网架设搭建_附赠GM工具+视频教程本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!!教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没问题,跟着教程走也是可以搭建成功的,但是一定要有耐心......
  • 永恒之蓝漏洞复现(ms17-010)
    永恒之蓝漏洞复现(ms17-010)环境信息收集先扫描目标靶机IP进入MSF查看是否存在永恒之蓝的漏洞攻击永恒之蓝漏洞复现(ms17-010)环境攻击机:kali靶机:WindowsServer2008信息收集对ip进行收集开放什么端口先扫描目标靶机IP因为在同一个内网之中所以可以使用arp-......
  • 永恒之黑复现
    永恒之黑复现一.永恒之黑介绍原理2020年3月,微软公布SMB远程代码执行漏洞(CVE-2020-0796)又称“永恒之黑”,该漏洞由SMB3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,没有检查长度是否合法,最终导致整数溢出,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码,攻......
  • 永恒的T800 —— 终结者T800 —— 智能机器人(双足机器人、人形机器人、humanoid)
    终结者T800全身像墨生青铜雕像摆件工艺品艺术品铸铜收藏品铜手办网店地址:https://item.taobao.com/item.htm?id=745037184577&skuId=5234347429545&spm=a21m98.27004841......
  • 2.27 闲话 & solution 『你是太阳神倾倒而下美酒的甜香/是最高的永恒破碎之后的希望』
    考完试了,我想听歌写了几道LCT,但是都是板子我想听歌Cave洞穴勘测LCT板子啊,直接乱搞就行对于Connect操作和Destroy操作其实是Link和Cut的板子至于Query操作么...阿拉阿拉,直接对(u,v)都进行一次Find,然后判断是否相等即可核心代码就那么几行intn,m;FastI>>n>>m;while(m--......
  • msf打永恒之蓝操作
    msf打永恒之蓝操作启动msf后,可以查看ms17-010的相关漏洞searchms17-010选用payload类型setpayloadwindows/x64/meterpreter/reverse_tcp选择漏洞利用类型:永恒之蓝setexploitwindows/smb/ms17_010_eternalblue设置攻击地址setrhost192.168.208.176攻......
  • Windows Server 2008 R2修复永恒之蓝漏洞
    一、情况描述服务器安装的WindowsServer2008R2standard系统,通过扫描发现系统存在永恒之蓝漏洞MS17-010(CVE-2017-0143、CVE-2017-0144、CVE-2017-0145、CVE-2017-0146CVE-2017-0147和CVE-2017-0148),需要从微软官网下载KB4012212这个系统补丁进行修复。1、查看漏洞详情2......