首页 > 其他分享 >小科技之卷积解决字符串匹配问题

小科技之卷积解决字符串匹配问题

时间:2023-03-11 22:13:09浏览次数:48  
标签:匹配 limits 卷积 sum times 字符串

小科技之卷积解决字符串匹配问题

OI中有各种字符串匹配问题,常见的有单模式串匹配、多模式串匹配和子串匹配等,一般可以用KMP、AC自动机、SAM解决。如果涉及到其他形式的单模式串匹配,这些传统的方式很不好解决,有没有更灵活的处理方法或者通法呢?

答案是有的,而且就是耳熟能详的FFT/NTT。

我们先考虑最基础的单模式串匹配,求长为m的字符串T在长为n的字符串S里出现了多少次,只不过我们要用卷积来实现。具体的,我们设\(C(i,j)\)表示\((s_i-t_j)\),即这两位是否相等,相等就为0,如果匹配了,那么自然有\(\sum\limits_{i=0}^{m-1}C(x-m+i+1,i)=0\),但是这样有反例,例如\(ab\)和\(ba\)都可以和\(ab\)匹配,因此我们改成\(\sum\limits_{i=0}^{m-1}\left|C(x-m+i+1,i)\right|=0\)才行。但是我们维护这个也是\(O(m)\)的,所以我们考虑给这一项平方,再设\(ans(x)=\sum\limits_{i=0}^{m-1}C(x-m+i+1,i)^2=\sum\limits_{i=0}^{m-1}(s_{x-m+i+1}-t_{i})^2\),我们暴力拆柿子,得:

\[ans(x)=\sum\limits_{i=0}^{m-1}s^2_{x-m+i+1}-2\times s_{x-m+i+1}\times t_{i}+t^2_{i}=\sum\limits_{i=0}^{m-1}s^2_{x-m+i+1}+\sum\limits_{i=1}^m t^2_i-\sum\limits_{i=0}^{m-1}2\times s_{x-m+i+1}\times t_i \]

这时前两项可以预处理后\(O(1)\)算,问题就在于怎么求最后一项。我们发现这个形式不好看,于是我们把T翻转,即\(t_i\)变成\(t_{m-i-1}\),那么就变成了

\[\sum\limits_{i=0}^{m-1}2\times s_{x-m+i+1}\times t_{m-i-1} \]

注意到\(x-m+i+1+m-i-1=x\),那么这显然就是一个卷积式,我们可以\(O(n\log n)\)求出每一项,这样就可以\(O(n\log n)\)求出\(ans(x)\)了。

从这个算法得到启发,我们来总结做题的方法。

第一步:设计通配函数,即上文中的\(C(i,j)\)。

第二步:设计完全通配函数,即上文中的\(ans(x)\)。

第三步:计算每一位的完全通配函数的值。

来看几道简单的例题叭

1.P3763 [TJOI2017]DNA

2.P4173 残缺的字符串

3.CF528D Fuzzy Search

标签:匹配,limits,卷积,sum,times,字符串
From: https://www.cnblogs.com/Xttttr/p/17207151.html

相关文章

  • 字符串函数
    字符串函数一:strlen()函数strlen()用于统计字符串的长度使用缩短字符串长度的函数#include<stdio.h>#include<string.h> //内含字符串函数原型voidfit(char......
  • 对象、数组、字符串的一些方法(笔记)
    对象字符串方法数组方法 ......
  • SQL中截取字符串方法
    1left(str,length)#从左边开始截取str,length是截取的长度23right(str,length)#从右边开始截取str,length是截取的长度45substring(str,substr,m)#返回字符subs......
  • shell子字符串截取
    http://c.biancheng.net/view/1120.htmlShell截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取。从指定位置开始截取这种方式需要两个参数:除......
  • 字符串压缩(三)之短字符串压缩
    摘自:https://blog.csdn.net/jh035512/article/details/128090607一、通用算法的短字符压缩开门见山,我们使用一段比较短的文本:Narrator:Itisrainingtoday.So,Pe......
  • test20230304考试总结(2023春 · 字符串)
    前言赛时得分明细:ABCDTotalRank1001000702702C题如此说道:字符串没有学好的报应!!A.P4391[BOI2009]RadioTransmission无线传输题面给定一个字......
  • day11 打卡20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求
    day11打卡20.有效的括号1047.删除字符串中的所有相邻重复项150.逆波兰表达式求值20.有效的括号20题目链接1.本来使用的是Stack,时间2ms,内存39.6MB。而Deque时间......
  • js判断是否是字符串 instanceof
    exportfunctionisString(str){if(typeofstr==="string"||strinstanceofString){returntrue}returnfalse}conststr=newString('hello'......
  • HJ14 字符串排序
    描述给定n个字符串,请对n个字符串按照字典序排列。 数据范围: 1\len\le1000\1≤n≤1000  ,字符串长度满足 1\lelen\le100\1≤len≤100 输入描述:......
  • HJ59 找出字符串中第一个只出现一次的字符
    描述找出字符串中第一个只出现一次的字符  数据范围:输入的字符串长度满足 1\len\le1000\1≤n≤1000  输入描述:输入一个非空字符串输出描述:输出第......