LGP4173残缺的字符串
题解
- 由于有通配符,所以$kmp$失效了;
- 将通配符看成0,其余字符看成互不相同的数字,$A,B$串对应得到$a,b$数组;
- 定义:
- $f(p) = \sum_{i=0}^{m-1} a_{i}b_{p+i} (a_{i} - b_{p+i})^2 $
- 只需要判断$f(p)$是否为0就可以知道$p$开头是否可以匹配;
- $f(p) = \sum_{i=0}^{m-1} a_{i}^{3} b_{p+i} - 2 a_{i}^2 b_{p+i}^2 + a_{i} b_{p+i}^{3} $
- 反转一下$A$串凑成卷积:
- $f(p) = \sum_{i=0}^{m-1} a_{m-1-i}^{3} b_{p+i} - 2 a_{m-1-i}^{2} b_{p+i}^{2} + a_{m-1-i} b_{p+i}^{3}$
- 做三次$DFT$一次$IDFT$求出三个卷积和即可;
- 注意$B$串没有的位置全是0;
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define ld double
using namespace std;
const int N=<<;
const ld pi=acos(-);
int m,n,len,L,t1[N],t2[N],tot,ans[N],rev[N];
char s[N];
struct C{
ld x,y;
C(ld _x=,ld _y=):x(_x),y(_y){};
C operator +(const C&A)const{return C(x+A.x,y+A.y);}
C operator -(const C&A)const{return C(x-A.x,y-A.y);}
C operator *(const C&A)const{return C(x*A.x-y*A.y,x*A.y+y*A.x);}
C operator /(const ld&A)const{return C(x/A,y/A);}
}a[N],b[N],c[N];
void fft(C*a,int f){
for(int i=;i<len;++i)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=;i<len;i<<=){
C wn=C(cos(pi/i),f*sin(pi/i));
for(int j=;j<len;j+=i<<){
C w=C(,);
for(int k=;k<i;++k,w=w*wn){
C x=a[j+k],y=w*a[i+j+k];
a[j+k]=x+y,a[i+j+k]=x-y;
}
}
}
if(!~f)for(int i=;i<len;++i)a[i]=a[i]/len;
}
int main(){
// freopen("P4173.in","r",stdin);
// freopen("P4173.out","w",stdout);
scanf("%d%d",&m,&n);
scanf("%s",s);
for(int i=;i<m;++i)t1[i]=s[m-i-]=='*'?:s[m-i-]-'a'+;
scanf("%s",s);
for(int i=;i<n;++i)t2[i]=s[i]=='*'?:s[i]-'a'+;
for(len=;len<n+m;len<<=,L++);
for(int i=;i<len;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-)); for(int i=;i<len;++i)a[i].x=t1[i]*t1[i]*t1[i],a[i].y=;
for(int i=;i<len;++i)b[i].x=t2[i],b[i].y=;
fft(a,);fft(b,);
for(int i=;i<len;++i)c[i]=c[i]+a[i]*b[i]; for(int i=;i<len;++i)a[i].x=t1[i]*t1[i],a[i].y=;
for(int i=;i<len;++i)b[i].x=t2[i]*t2[i],b[i].y=;
fft(a,);fft(b,);
for(int i=;i<len;++i)c[i]=c[i]-a[i]*b[i]*; for(int i=;i<len;++i)a[i].x=t1[i],a[i].y=;
for(int i=;i<len;++i)b[i].x=t2[i]*t2[i]*t2[i],b[i].y=;
fft(a,);fft(b,);
for(int i=;i<len;++i)c[i]=c[i]+a[i]*b[i]; fft(c,-);
for(int i=;i<=n-m;++i){
int d=floor(c[i+m-].x+0.5);
if(!d)ans[++tot]=i;
}
printf("%d\n",tot);
for(int i=;i<=tot;++i)printf("%d ",ans[i]+);
return ;
}
LGP4173残缺的字符串的更多相关文章
- BZOJ 4259: 残缺的字符串 [FFT]
4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...
- 【BZOJ4259】残缺的字符串
[BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时, ...
- 【BZOJ4259】残缺的字符串(FFT)
[BZOJ4259]残缺的字符串(FFT) 题面 给定两个字符串\(|S|,|T|\),两个字符串中都带有通配符. 回答\(T\)在\(S\)中出现的次数. \(|T|,|S|<=300000\ ...
- 【BZOJ4259】残缺的字符串 FFT
[BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时, ...
- CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串
Fuzzy Search 给你文本串 S 和模式串 T,求 S 的每个位置是否能模糊匹配上 T. 这里的模糊匹配指的是把 T 放到 S 相应位置上之后,T 中每个字符所在位置附近 k 个之内的位置上的 ...
- luoguP4173 残缺的字符串 FFT
luoguP4173 残缺的字符串 FFT 链接 luogu 思路 和昨天做的题几乎一样. 匹配等价于(其实我更喜欢fft从0开始) \(\sum\limits_{i=0}^{m-1}(S[i+j]- ...
- 洛谷 P4173 残缺的字符串 (FFT)
题目链接:P4173 残缺的字符串 题意 给定长度为 \(m\) 的模式串和长度为 \(n\) 的目标串,两个串都带有通配符,求所有匹配的位置. 思路 FFT 带有通配符的字符串匹配问题. 设模式串为 ...
- Luogu P4173 残缺的字符串-FFT在字符串匹配中的应用
P4173 残缺的字符串 FFT在字符串匹配中的应用. 能解决大概这种问题: 给定长度为\(m\)的A串,长度为\(n\)的B串.问A串在B串中的匹配数 我们设一个函数(下标从\(0\)开始) \(C ...
- P4173 残缺的字符串(FFT字符串匹配)
P4173 残缺的字符串(FFT字符串匹配) P4173 解题思路: 经典套路将模式串翻转,将*设为0,设以目标串的x位置匹配结束的匹配函数为\(P(x)=\sum^{m-1}_{i=0}[A(m-1 ...
随机推荐
- excel窗口独立显示/单独显示
天赋异禀的亲,一看就懂!
- Homebrew1.5之后安装PHP和扩展
Homebrew 1.5 宣布放弃 homebrew/php, 转而使用homebrew/core维护, 详见https://brew.sh/2018/01/19/homebrew-1.5.0/ 于是 ...
- dmesg命令详解
基础命令学习目录 http://linux.cn/article-3587-1.html dmesg 命令的使用范例 下面我们展示一些最负盛名的‘dmesg’命令工具以及其实际使用举例.‘dmesg’ ...
- Performance — 前端性能监控利器
Performance是一个做前端性能监控离不开的API,最好在页面完全加载完成之后再使用,因为很多值必须在页面完全加载之后才能得到.最简单的办法是在window.onload事件中读取各种数据. 大 ...
- Django_分页
目录 基本语法 示例 示例1 使用django内置Paginator模块 示例2 改写Paginator 示例3 自定义pager组件 示例3.1 objs与pager各自单独使用 示例3.2 obj ...
- linux, configure --prefix 的作用
指定安装路径不指定prefix,则可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc.其它的资源文件放在/usr ...
- Daily Scrum (2015/11/6)
今晚除了玉钟焕的其他成员在一起开了个短会.讨论有关添加新功能以及一些BUG问题.由于时间原因,我们本想把动态爬取功能留到第二个迭代中,但是现在目前时间还够,我们便一起对这一功能的讨论和实现进行分析. ...
- 冲刺One之站立会议8 /2015-5-21
今天我们把聊天界面做了优化和改进,主要实现了聊天的功能.显示了正在进行通信的成员列表,和当前状态,是否连通和正常通信,大体完成了预期的目标. 燃尽图8
- Chapter 10 软件测试
软件测试是软件质量保证的一项关键活动,验证与确认是贯穿软件生命周期的规范化评估方法.软件验证则试图证明在软件生存的各个阶段是否满足客户的需求,软件确认是一系列的活动和过程,两个活动相互独立但却相辅相成 ...
- <!CDATA[]]用法详解
所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA PCDATA 指的是被解析的字符数据(Parsed Chara ...