博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
阅读量:5215 次
发布时间:2019-06-14

本文共 1236 字,大约阅读时间需要 4 分钟。

原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html

题意

  给定两个字符串,在根据给定的字符表转成相应的字符之后,问前一个串在后面一个串中匹配了多少次。

  一个串在另一个串的某一个位置匹配,当且仅当从该位置起截取长度与那个串相同的一个子串,这个子串与那个串等价。

  定义两个串等价,当且仅当这两个串的对应位置的 Ascll 码值相差不大于 1 。

  任意一个串的长度 $\leq 250000$。

题解

  FFT 基础套路题。

  为了偷懒,我们写 11 次 DFT 。

  但是这样做 double 精度不大行,long double 要超时。

  所以我们用 NTT 来搞定。

  注意别爆 long long 。

  关于 FFT 和套路介绍,下面这个链接所指向的博文有详细介绍。

  

  

  套路:

  首先将第一个串翻转一下。

  然后构造式子:

  $f_i=\sum_{j=0}^{i} (S_i-T_j)^2((S_i-T_j)^2-1)$

  展开之后 NTT 算出来就可以了。

代码

#include 
using namespace std;typedef long long LL;const int N=1<<22,mod=998244353;int a,b,n,d;int S[N],T[N],R[N];char S1[N],T1[N];char s[27];int Pow(int x,int y){ int ans=1; for (;y;y>>=1,x=1LL*x*x%mod) if (y&1) ans=1LL*ans*x%mod; return ans;}int w[N],A[N];int A4[N],A3[N],A2[N],A1[N],A0[N];int B4[N],B3[N],B2[N],B1[N],B0[N];void FFT(int a[],int n){ for (int i=0;i
>1,d=1;d
<<=1,t>>=1) for (int i=0;i
<<1)) for (int j=0;j
vec;int main(){ scanf("%s%s%s",S1,T1,s); a=strlen(S1),b=strlen(T1); for (int i=0;i
>1]>>1)|((i&1)<<(d-1)); w[0]=1,w[1]=Pow(3,(mod-1)/n); for (int i=2;i

  

转载于:https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html

你可能感兴趣的文章
白话经典算法系列之六 快速排序 快速搞定
查看>>
错了:用流量能够放肆,有wifi则要节制
查看>>
https://zhidao.baidu.com/question/362784520674844572.html
查看>>
【MFC 学习笔记】CFile读写文件
查看>>
PAT B1018.锤子剪刀布(20)
查看>>
Extjs控件之 grid打印功能
查看>>
枚举类型(不常用)递归
查看>>
ETL
查看>>
Tomcat源码分析(六)--日志记录器和国际化
查看>>
今天把csdn的博客搬家到博客园
查看>>
D3.js+Es6+webpack构建人物关系图(力导向图),动态更新数据,点击增加节点,拖拽增加连线......
查看>>
基于网络的 Red Hat 无人值守安装
查看>>
Mybatis第六篇【配置文件和映射文件再解读、占位符、主键生成与获取、Mapper代理】...
查看>>
MySQL学习笔记(二):MySQL数据类型汇总及选择参考
查看>>
jQ 移动端返回顶部代码整理
查看>>
博客园界面美化
查看>>
sql查询远程数据库的表的数据并填充到本地数据库的表
查看>>
YII缓存依赖的应用
查看>>
决策树在机器学习的理论学习与实践
查看>>
Biee 11g权限详解
查看>>