day10T1改错记

题面

有两个串\(A\)\(B\),长度分别为\(n\)\(m\),只含'Z','P','S','B'四个大写字母,定义\(B\)在第\(p\)位(\(0 \le p \le n - m\))匹配\(A\)为对\(B\)的每个位置\(B_i\),在\(A_{\max (0, p + i - k)}\)\(A_{min(n - 1, p + i + k)}\)中都存在与\(B_i\)相同的字符,现给出\(A\)\(B\)\(k\),问\(B\)在多少个位置和\(A\)匹配

题外话

怕是几天来改得最快的一道题了……

解析

只有四个字母,就考虑分开处理

枚举每个字符

\(a_i\)表示\(A\)串的第\(i\)个位置能不能匹配这个字符,\(b_i\)表示\(B\)串的第\(i\)个位置是否是这个字符(\(a_i, b_i\)都是\(0/1\))

那么\(p\)位置能匹配的位置数量就是\(\sum_{i = 0}^{m - 1} b_i \cdot a_{p + i} = \sum_{i = 0}^{n - p - 1} b_i \cdot a_{p + i}\),上界可以扩展因为\(m - 1\)之后的位置\(b\)\(0\),不会影响结果

设这个式子为\(f(p)\),把\(a_i\)翻转一下,即\(g(i) = a_{n - 1 - i}\),那么:
\[ \begin{align} f(p) & = \sum_{i = 0}^{n - p - 1} b_i\cdot a_{p + i} \\ & = \sum_{i = 0}^{n - p - 1} b_i \cdot g(n - p - 1 - i) \end{align} \]
然后把\(f\)翻转,得到:
\[ f(n - 1 - p) = \sum_{i = 0}^{n - p - 1} b_i \cdot g(n - p - 1 - i) \]
这不就是个卷积吗,\(FFT\)或者\(NTT\)都可以做

对每个字符求出各个位置能匹配的数量,显然只有当一个位置各个字符匹配数量的和为\(m\)的时候\(B\)才能在这个位置匹配\(A\),最后判一下统计答案就行了

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
#define MAXN 200005typedef long long LL;
const int mod = 998244353;
const char set[] = {'Z', 'P', 'S', 'B'};int qpower(int, int, int);
void pre_rev(int);
void NTT(int *, int, int);int K, n, m, ans, match[MAXN], rev[MAXN << 2], f[MAXN << 2], g[MAXN << 2];
char A[MAXN], B[MAXN];inline void inc(int &x, int y) { x += y; if (x >= mod) x -= mod; }
inline void dec(int &x, int y) { x -= y; if (x < 0) x += mod; }
inline int add(int x, int y) { x += y; return x >= mod ? x - mod : x; }
inline int sub(int x, int y) { x -= y; return x < 0 ? x + mod : x; }int main() {freopen("base.in", "r", stdin);freopen("base.out", "w", stdout);scanf("%d%s%s", &K, A, B);n = strlen(A), m = strlen(B);if (m > n) { puts("0"); return 0; }for (int i = 0; i < 4; ++i) {memset(f, 0, sizeof f); memset(g, 0, sizeof g);for (int j = 0, last = -1; j < n; ++j) {if (A[j] == set[i]) last = j;if ((~last) && last >= j - K) g[j] = 1;}for (int j = n - 1, last = -1; j >= 0; --j) {if (A[j] == set[i]) last = j;if((~last) && last <= j + K) g[j] = 1;}for (int j = 0; j < m; ++j)if (B[j] == set[i]) f[j] = 1;std::reverse(g, g + n);int sz;for (sz = 0; (1 << sz) < (n << 1); ++sz);pre_rev(sz);NTT(f, sz, 1); NTT(g, sz, 1);for (int i = 0; i < (1 << sz); ++i) f[i] = (LL)f[i] * g[i] % mod;NTT(f, sz, -1);for (int i = 0; i <= n - m; ++i) inc(match[i], f[n - 1 - i]);//debug//for (int i = 0; i <= n - m; ++i) printf("%d ", f[n - 1 - i]);//puts("");}for (int i = 0; i <= n - m; ++i) if (match[i] == m) ++ans;printf("%d\n", ans);return 0;
}
int qpower(int x, int y, int p) {int res = 1;while (y) {if (y & 1) res = (LL)res * x % p;x = (LL)x * x % p; y >>= 1;}return res;
}
void NTT(int *arr, int sz, int tp) {for (int i = 0; i < (1 << sz); ++i)if (rev[i] > i) std::swap(arr[i], arr[rev[i]]);for (int len = 2, half = 1; len <= (1 << sz); len <<= 1, half <<= 1) {int wn = qpower(3, (mod - 1) / len, mod);if (tp == -1) wn = qpower(wn, mod - 2, mod);for (int i = 0; i < (1 << sz); i += len) {int w = 1;for (int j = 0; j < half; ++j, w = (LL)w * wn % mod) {int x = arr[i + j], y = (LL)arr[i + j + half] * w % mod;inc(arr[i + j], y); dec(arr[i + j + half] = x, y);}}}if (tp == -1) {int inv = qpower(1 << sz, mod - 2, mod);for (int i = 0; i < (1 << sz); ++i) arr[i] = (LL)arr[i] * inv % mod;}
}
inline void pre_rev(int sz) {for (int i = 0; i < (1 << sz); ++i) rev[i] = ((rev[i >> 1] >> 1) | ((i & 1) << sz - 1));
}
//Rhein_E

转载于:https://www.cnblogs.com/Rhein-E/p/10524007.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构层和建模域逻辑

在讨论用于建模域逻辑&#xff08;例如事务脚本&#xff0c;表模块&#xff0c;域模型&#xff09;的PoEAA模式时&#xff0c;我注意到人们对域模型模式是最好的印象&#xff08;尽管印象不对&#xff09;。 因此&#xff0c;他们开始将其应用于所有内容。 不配领域模型模式 让…

一步步通过命令行cl.exe编译Windows程序

Windows系统下有强大的IDE工具VS&#xff0c;VC6.0等&#xff0c;隐藏了很多编译和链接的细节。事实上&#xff0c;VS是通过调用cl.exe进行源代码编译。接着调用link.exe进行目标文件的链接等操作。有时候&#xff0c;如果出现编译或者链接错误&#xff0c;我们也可以通过命令行…

将数据流链接到加密转换的流CryptoStream 类

1.命名空间:System.Security.Cryptography 程序集:mscorlib&#xff08;在 mscorlib.dll 中&#xff09;----------------------------------------------------继承层次结构-System.Object----- System.MarshalByRefObject--------- System.IO.Stream-------------System.Secu…

Spring Batch:多种格式输出编写器

作为Spring Batch的坚定倡导者&#xff0c;我一直在谈论Spring Batch的概念&#xff0c;它为开发人员提供了一个框架&#xff0c;使他们可以专注于解决业务需求。 这样&#xff0c;它使开发人员不必花费过多的时间来解决所有技术问题以支持该解决方案。 为了说明我的意思&…

《七哥说道》第五章:入职惨做苦力,画饼一望无际

【转载请注明】&#xff1a; 原文出处&#xff1a;https://www.cnblogs.com/jstarseven/p/10521426.html 作者&#xff1a;jstarseven 码字挺辛苦的..... “你是住在回龙观东大街附近吗&#xff0c;那先不急下班&#xff0c;一会我开车顺带你回去吧&#xff01;” 第二家公司的…

通过源码将git升级到最新版

因为go-get下载hugo失败&#xff0c;需要升级git到最新版本。 下载最新git代码 wget -O git-master.zip https://github.com/git/git/archive/master.zip编译 unzip git-master.zip cd git-masteryum install openssl-devel curl-devel expat-devel perl-ExtUtils-MakeMaker …

win10只有edge浏览器能上网的解决方法

问题描述&#xff1a;电脑就只有edge浏览器和自带的邮件可以上网&#xff0c;但是QQ Chrome&#xff0c;360浏览器都无法上网&#xff1b; 解决方法&#xff1a;打开命令提示符&#xff08;管理员&#xff09;&#xff0c;执行netsh winsock reset&#xff0c;重启系统就好了。…

CTF dotNet逆向分析

题目来源http://ctf.idf.cn/index.php?ggame&marticle&aindex&id36 .NET逆向第一题 嗯&#xff0c;看名字就应该明白了&#xff0c;快去下载吧&#xff01; http://pan.baidu.com/s/1bnvVbp9 下载后是一个DotNetCrackMe1.exe文件。 分析 逆向分析的基础问题&…

xaas_从XaaS到Java EE – 2012年哪款该死的云最适合我?

xaas您是否曾经想过要使Java EE正常运行需要什么&#xff1f; 是的 多年。 从托管我自己的主机开始&#xff0c;转到一些托管产品 &#xff0c;最后偶然发现了PaaS运动。 老实说&#xff0c;我并没有太认真。 我只是想把我的东西放到某个地方&#xff0c;而不在乎解决方案。 在…

day3----python变量与常量

一、python变量&#xff1a; 1、概述&#xff1a;&#xff08;1&#xff09;程序可操作的存储空间的名称&#xff1b;&#xff08;2&#xff09;程序运行期间可以改变的数据&#xff08;3&#xff09;每个变量都有特定的类型 2、作用&#xff1a;将不同类型的数据存储到内存中 …

垃圾收集中的代际差异

去年&#xff0c;我一直在帮助新兴公司Instana创建一个Java代理&#xff0c;该代理可跟踪Java应用程序中的执行情况。 收集并结合此执行数据以生成用户请求以及系统所有者半球内服务之间的最终通信的跟踪。 这样&#xff0c;可以可视化非结构化通信&#xff0c;从而显着简化了由…

简单解释 MapReduce 算法

一个有趣的例子 你想数出一摞牌中有多少张黑桃。直观方式是一张一张检查并且数出有多少张是黑桃&#xff1f; MapReduce方法则是&#xff1a; 给在座的所有玩家中分配这摞牌 让每个玩家数自己手中的牌有几张是黑桃&#xff0c;然后把这个数目汇报给你 你把所有玩家告诉你的数…

appium + python 搭建

appium python 1、安装jdk地址&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html配置&#xff1a;系统变量新建JAVA_HOME,输入jdk安装路径&#xff0c;如&#xff1a;C:\Program Files\Java\jdk1.8.0_201。系统变量新建CLAS…

ubuntu 12.04 /sbin/ldconfig.real: /usr/local/lib/*.so.8 不是符号连接 解决办法

最近在ubuntu12.04下使用sudo apt-get install安装软件的时候最后总会报这种错误。建立硬连接即可解决&#xff1a; sudo ln -sf /usr/local/lib/libprotobuf.so.8.0.0 /usr/local/lib/libprotobuf.so.8 截图上传没成功&#xff0c;麻烦。 在弄一次。

Linux GCC常用命令

1简介 2简单编译 2.1预处理 2.2编译为汇编代码(Compilation) 2.3汇编(Assembly) 2.4连接(Linking) 3多个程序文件的编译 4检错 5库文件连接 5.1编译成可执行文件 5.2链接 5.3强制链接时使用静态链接库 1简介 GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展&#…

JDK 9 @不建议使用的注释增强功能

在帖子中&#xff0c; Deprecated可能会是什么样子&#xff1f; &#xff0c;我当时使用JEP 277 &#xff08;“增强的弃用”&#xff09;的描述来指导创建增强的自定义Deprecated注释。 但是&#xff0c;自从发布该文章以来&#xff0c;JEP 277进行了重大更改。该文章总结了J…

数据结构和算法基础之冒泡排序

/// <summary>/// 冒泡排序/// </summary>/// <param name"arry"></param>public static void BubbleSort(int[] arry){for (int i 0; i < arry.Length; i)//外层循环控制排序趟数{for(int j0;j<arry.Length-i-1;j)//内层循环控制每一…

Java Web应用程序的SecureLogin

不&#xff0c;标题中没有缺少空格。 这与安全登录无关 &#xff0c;而与安全顾问Egor Homakov开发的SecureLogin协议有关&#xff0c;该协议因在没有权限的情况下致力于掌握 Rails项目而闻名 。 SecureLogin协议非常有趣&#xff0c;因为它不依赖任何中央方&#xff08;例如&…

最通俗的CRC校验原理剖析

以下内容摘自笔者即将出版的最新著作《深入理解计算机网络》一书。本书将于12月底出版上市&#xff0c;敬请留意&#xff01;&#xff01; 本书原始目录参见此文&#xff1a;http://winda.blog.51cto.com/55153/1063878 5.3.2 循环冗余校验检错方案 上节介绍的奇偶校验码&#…

SpringMVC 上传文件and过滤器

SpringMVC提供了一个MultipartResolver接口用来实现文件上传&#xff0c;并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolver。如果要在SpringMVC中实现文件上传功能&#xff0c;就可以在springmvc.xml中配置MultipartResolver接口的实现类。 以下…