题目描述:

给出一个模板串和一个母串,问模板串在母串中出现过几次。带通配符。

题目分析:

设F[i]表示把模板串是否能够与母串的第[i−s+1−i][i−s+1−i][i-s+1-i]形成的串匹配.
f[i]/g[i]表示两个串的数值,当为’*’的时候,值为0,否则为与’a’的差值+1
F[i]=∑s−1j=0f(i−j)g(i)∗(f(i−j)−g(i))2F[i]=∑j=0s−1f(i−j)g(i)∗(f(i−j)−g(i))2F[i]=\sum_{j=0}^{s-1}f(i-j)g(i)*(f(i-j)-g(i))^2
显然,当模板串能够与母串的第[i−s+1−i][i−s+1−i][i-s+1-i]形成的串匹配.
F[i]==0F[i]==0F[i]==0
F[i]=f[i−j]3∗g[j]−2∗f[i−j]2∗g[j]2+f[i−j]∗g[j]3F[i]=f[i−j]3∗g[j]−2∗f[i−j]2∗g[j]2+f[i−j]∗g[j]3F[i]=f[i-j]^3*g[j]-2*f[i-j]^2*g[j]^2+f[i-j]*g[j]^3
每一项都是一个卷积的形式,做3次FFT就行了

题目链接:

Luogu 4173
BZOJ 权限题目

Ac 代码:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#define ll long long
const int maxm=300010*4;
const double PI=std::acos(-1);
struct complex{double real,imag;complex(){};complex(double _real,double _imag):real(_real),imag(_imag){}
};
inline complex operator + (complex x,complex y){return (complex){x.real+y.real,x.imag+y.imag};}
inline complex operator - (complex x,complex y){return (complex){x.real-y.real,x.imag-y.imag};}
inline complex operator * (complex x,complex y){return (complex){x.real*y.real-x.imag*y.imag,x.real*y.imag+y.real*x.imag};}
int len,rev[maxm];
complex A[maxm],B[maxm];
inline void FFT(complex *a,int n,int f)
{for(int i=0;i<n;i++) if(i<rev[i]) std::swap(a[i],a[rev[i]]);for(int i=1;i<n;i<<=1){complex wn=(complex){std::cos(PI/i),f*std::sin(PI/i)};for(int j=0;j<n;j+=(i<<1)){complex w=(complex){1,0};for(int k=0;k<i;k++,w=w*wn){complex x=a[j+k];complex y=a[i+j+k]*w;a[j+k]=x+y;a[i+j+k]=x-y;}}}if(f==1) return;for(int i=0;i<n;i++) a[i].real=a[i].real/n;
}
inline void init(int n)
{for(int i=0;i<n;i++) A[i]=(complex){0,0},B[i]=(complex){0,0};
}
double f[maxm],g[maxm];
char s[maxm],t[maxm];
ll F[maxm];
int n,m,S,T;
int ans[maxm],tot;
int main()
{scanf("%d%d",&S,&T);scanf("%s%s",s,t);for(int i=0;i<S/2;i++) std::swap(s[i],s[S-i-1]);for(int i=0;i<T;i++) f[i]=(t[i]=='*'?0:(t[i]-'a'+1.0));for(int i=0;i<S;i++) g[i]=(s[i]=='*'?0:(s[i]-'a'+1.0));m=S+T-2;for(n=1;n<=m;n<<=1) len++;for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));init(n);for(int i=0;i<T;i++) A[i].real=f[i]*f[i]*f[i];for(int i=0;i<S;i++) B[i].real=g[i];FFT(A,n,1),FFT(B,n,1);for(int i=0;i<n;i++) A[i]=A[i]*B[i];FFT(A,n,-1);for(int i=0;i<T;i++) F[i]=(ll)round(A[i].real);init(n);for(int i=0;i<T;i++) A[i].real=(f[i]*f[i]);for(int i=0;i<S;i++) B[i].real=(g[i]*g[i]); FFT(A,n,1),FFT(B,n,1);for(int i=0;i<n;i++) A[i]=A[i]*B[i];FFT(A,n,-1);for(int i=0;i<T;i++) F[i]-=2ll*round(A[i].real);init(n);for(int i=0;i<T;i++) A[i].real=(f[i]);for(int i=0;i<S;i++) B[i].real=(g[i]*g[i]*g[i]); FFT(A,n,1),FFT(B,n,1);for(int i=0;i<n;i++) A[i]=A[i]*B[i];FFT(A,n,-1);for(int i=0;i<T;i++) F[i]+=(ll)round(A[i].real);for(int i=S-1;i<T;i++) if(!F[i]) ans[++tot]=i-S+2;printf("%d\n",tot);for(int i=1;i<=tot;i++) printf("%d ",ans[i]);return 0;
}

[Luogu4173/BZOJ4259] 残缺的字符串相关推荐

  1. [BZOJ4259]残缺的字符串

    Description: 给定两个带通配符的串,求可能出现几次匹配,以及这些匹配位置 Hint: \(n \le 3*10^5\) Solution: 定义匹配函数 \(P(x)=\sum_{i=x} ...

  2. 【BZOJ4259】残缺的字符串

    题面 1684 -- [BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现 ...

  3. 洛谷 - P4173 残缺的字符串(多项式匹配字符串-NTT)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt,都含有通配符 '*',现在问字符串 ttt 可以匹配字符串 nnn 的哪些位置 题目分析 ...

  4. P4173 残缺的字符串 FFT匹配含有通配符的字符串

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为m,nm,nm,n的串a,ba,ba,b,问你bbb串中每个长度为mmm的连续字串能否与aaa完全匹配,其中含有通配符∗*∗,输出每个位置的开头 ...

  5. P4173 残缺的字符串

    P4173 残缺的字符串 题意: 有A,B两个串,每个串都有通配符,问A为模板串,对于 B 的每一个位置 i,从这个位置开始连续 m 个字符形成的子串是否可能与 A 串完全匹配? 题解: 我们定义两个 ...

  6. BZOJ 4259: 残缺的字符串 [FFT]

    4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...

  7. 【BZOJ】4259: 残缺的字符串 FFT

    [题意]给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次.字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符.n<=3*10^5. [算 ...

  8. ●Codevs 4158 残缺的字符串

    题链: http://codevs.cn/problem/4158/ 题解: FFT. 定义两个相同长度的字符串s1,s2的距离为 $$dis(s1,s2)=\sum_{i=0}^{len-1}(s1 ...

  9. 洛谷P4173:残缺的字符串(FFT、通配符匹配)

    解析 通配符匹配的经典题. 设单词串为 AAA,文章串为 BBB. 把 AAA 翻转一下,判断问题就能转化为一个卷积的形式: F(p)=&i=0m−1match(Ai+1,Bp−i)F(p)= ...

  10. LGP4173残缺的字符串

    题解 由于有通配符,所以$kmp$失效了: 将通配符看成0,其余字符看成互不相同的数字,$A,B$串对应得到$a,b$数组; 定义: $f(p) = \sum_{i=0}^{m-1} a_{i}b_{ ...

最新文章

  1. java多线程中的异常处理
  2. 7限制cpu使用_Kubernetes 资源配额使用指南 | Linux 中国
  3. 操作系统原理之进程调度与死锁(三)
  4. bootstrap-table 新增可编辑行_现代Web开发堆栈工具DevExtreme 新增Gantt组件,助力项目管理...
  5. vue解决字符串模板@click无效的问题
  6. python程序设计实践教程答案-Python程序设计实践教程
  7. 无响应_搭建的Redis高可用,突然频繁无响应怎么破?
  8. python 对文件夹的相关操作
  9. HeadFirstJava——6_Java API
  10. unity3d 取锚点位置_天涯明月刀手游草鱼在哪里钓 天涯明月刀草鱼位置及|天涯|明月-游戏资讯...
  11. R语言:循环读取相似文件名的文件:
  12. mysql stuff函数_mysql   自定义 stuff
  13. word表格转换为图片
  14. Flutter中的Provider(八)-多个Provider-MultiProvider
  15. linux 自定义欢迎界面 /etc/motd文件
  16. 设(X1,X2,…,Xn) 是来自正态总体N(μ,σ2),的一个样本,其中μ,σ2未知,求μ与σ2的极大似然估计量.
  17. 运放稳定性连载14:RO何时转变为ZO?(3)
  18. jQuery Marquee
  19. 排查解决 - Linux无法访问百度(公网)?
  20. 魔拉格头皮净养凝露,告别满头油腻,还原头发清新

热门文章

  1. assimp android build,Windows环境下编译Assimp库生成Android可用的.so文件
  2. linux 网桥浅析
  3. 手把手教你7个常见数据库使用方法
  4. 别花时间抠图了,赶紧试试这几个免抠图的PNG图片网站!
  5. 庄子(公元前369年-公元前286年)
  6. 20年中国人均GDP排名变化
  7. 如何在CAD编辑软件中画椭圆
  8. K线技术指标实现详解—MA
  9. 期权波动率套利策略之谜
  10. 怎么把ppt文字大小设置一致_PPT基础入门技巧,这都不会?就别谈制作PPT了,学会瞬间提高档次...