题链:

http://codevs.cn/problem/4158/

题解:

FFT。

定义两个相同长度的字符串s1,s2的距离为

$$dis(s1,s2)=\sum_{i=0}^{len-1}(s1[i]-s2[i])^2s1[i]s2[i]$$

如果两个字符串相同,那么dis=0。

(对于本题而言,只需把通配符用0表示,其它字符c用c-'a'+1表示。)

然后看看如何求出文本串T(长度为n)和模式串S(长度为m)的总共匹配数。

定义T串从$l$位置开始的长度为m的子串和S的距离为$D(l)$,那么:

$$D(l)=\sum_{k=0}^{m-1}(T[l+k]-S[k])^2T[l+k]S[k]$$

为了构成卷积形式,我们把S串翻转,即

$$D(l)=D'(l+m-1)=\sum_{k=0}^{m-1}(T[l+k]-S[m-1-k])^2T[l+k]S[m-1-k]$$

然而这个仍然不是卷积形式,我们再继续化一下式子:(令D(l)=D'(l+m-1))

$$\begin{aligned}
D'(l+m-1)&=\sum_{k=0}^{m-1}(T[l+k]-S[m-1-k])^2T[l+k]S[m-1-k]\\
&=\sum_{k=0}^{m-1}(T[l+k]^3S[m-1-k]-2T[l+k]^2S[m-1-k]^2+T[l+k]S[m-1-k]^3)\\
&=\sum_{k=0}^{m-1}T[l+k]^3S[m-1-k]+\sum_{k=0}^{m-1}-2T[l+k]^2S[m-1-k]^2+\sum_{k=0}^{m-1}T[l+k]S[m-1-k]^3
\end{aligned}$$

然后逮着这个式子做3组卷积即可。

代码:

#include<bits/stdc++.h>
#define MAXN 1048577
#define INF 0x3f3f3f3f
using namespace std;
const double Pi=acos(-1),eps=1e-6;
typedef complex<double>Complex;
Complex null(0,0);
int A[MAXN],B[MAXN],order[MAXN];
int idx(char ch){if(ch=='*') return 0;return ch-'a'+1;
}
void getstring(int *s,int len){static char ch;for(int i=0;i<len;i++)scanf(" %c",&ch),s[i]=idx(ch);
}
void FFT(Complex *Y,int n,int sign){for(int i=1;i<n;i++) if(i<order[i]) swap(Y[i],Y[order[i]]);for(int d=2;d<=n;d<<=1){Complex dw(cos(2*Pi/d),sin(sign*2*Pi/d)),w,tmp;for(int i=0;w=Complex(1,0),i<n;i+=d)for(int k=i;k<i+d/2;w=w*dw,k++)tmp=w*Y[k+d/2],Y[k+d/2]=Y[k]-tmp,Y[k]=Y[k]+tmp;}
}
int main(){static int pos[MAXN];static Complex f1[MAXN],g1[MAXN],f2[MAXN],g2[MAXN],f3[MAXN],g3[MAXN],D[MAXN];int n,m,N,len,ans=0; scanf("%d%d",&n,&m);getstring(A,n); getstring(B,m); reverse(A,A+n);for(N=1,len=0;N<n+m-1;N<<=1) len++;for(int i=1;i<N;i++) order[i]=(order[i>>1]>>1)|((i&1)<<(len-1));for(int i=0;i<n;i++){f1[i]=Complex(A[i]*A[i]*A[i],0);f2[i]=Complex(A[i]*A[i],0);f3[i]=Complex(A[i],0);}for(int i=0;i<m;i++){g1[i]=Complex(B[i],0);      g2[i]=Complex(B[i]*B[i],0);g3[i]=Complex(B[i]*B[i]*B[i],0);}FFT(f1,N,1); FFT(g1,N,1);FFT(f2,N,1); FFT(g2,N,1);FFT(f3,N,1); FFT(g3,N,1);for(int i=0;i<N;i++) D[i]=f1[i]*g1[i]-2.0*f2[i]*g2[i]+f3[i]*g3[i];FFT(D,N,-1);for(int i=0;i<m-n+1;i++) if((int)((D[i+n-1].real()+0.5)/N)==0) pos[++ans]=i+1;printf("%d\n",ans);for(int i=1;i<=ans;i++) printf("%d ",pos[i]);printf("\n");return 0;
}

  

转载于:https://www.cnblogs.com/zj75211/p/8341247.html

●Codevs 4158 残缺的字符串相关推荐

  1. 【BZOJ4259】残缺的字符串

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

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

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

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

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

  4. P4173 残缺的字符串

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

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

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

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

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

  7. [BZOJ4259]残缺的字符串

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

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

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

  9. LGP4173残缺的字符串

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

最新文章

  1. Vue常用特性——表单操作、表单域修饰符(number:转化为数值 ;trim:去掉开始和结尾的空格 ; lazy : 将input事件切换为change事件)||自定义指令|| 局部指令
  2. 我做产品的三大思维:发散、纵横和表里(上)
  3. C#session共享+redis_Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享...
  4. 深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
  5. [Leetcode][第98 450 700 701题][JAVA][二叉搜索树的合法性、增、删、查][递归][深度遍历]
  6. Python---(9)数据科学领域常用的15个Python包
  7. 腾讯人均月薪8万!第一季度财报发布:微信月活数恐怖,游戏平均日赚4亿
  8. VMware虚拟机中ubuntu的磁盘怎么扩容
  9. Git pull 强制覆盖本地文件
  10. Taobao File System
  11. Win8 开发者训练营第一天的过程,感受和收获
  12. Mac更新Big Sur或者Monterey后没有管理员账户或当前账户没有管理员权限或rm /var/db/.AppleSetupDone: No such file or directory解决方案
  13. 网络安全之DOS攻击
  14. 『原创经典』标准日本语初级笔记完整版(1)
  15. 智能配电房综合监控系统的探讨
  16. 【机器学习15】决策树模型详解
  17. 过往云烟~如梦随风飘!!!
  18. 读书笔记 - 《经济学通识》
  19. 关于File.separator[转]
  20. 人工智能(8)---一文读懂人工智能产业链:基础技术、人工智能技术及人工智能应用

热门文章

  1. 技术解析:为什么 B 站的弹幕可以不挡人物?
  2. 奇思乐高机器人怎么样_奇思机器人:如果孩子和优质的教育只有一步之遥,那就是乐高的差距...
  3. 微信PC扫码支付和微信H5支付
  4. 使用poi替换XWPFTableCell内容,并设置行间距
  5. vscode 解决格式化代码无效问题
  6. 好用工具推荐--持续更新
  7. 如何找到文件夹选项?
  8. android studio中添加gif文件格式,利用Android Studio截屏和录制视频并转为gif
  9. 2020_8_21捷高凉经
  10. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.15日(2018省赛A组第3题)