博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF528D]Fuzzy Search【FFT】
阅读量:5886 次
发布时间:2019-06-19

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

给定母串\(S\)和模式串\(T\),字符集大小为\(4\),给定\(k\)\(T\)在某个位置\(i\)匹配,当且仅当\(\forall\; j\in [0, |T|-1], \exists p\in [i-k, i+k]\)使得\(T_j=S_{i+p+j}\),求\(T\)的匹配次数
\(|S|, |T|\le 2*{10}^5\)
\(|T|=m\),
对于每个字符\(c\),令\(a[i]=[S_i\)能匹配\(c]\)\(b[i]=[T_i == c]\)
贡献\(f[j]=\sum_{i=0}^{m-1}a[j+i]*b[i]\),当总贡献为\(m\)\(j\)位置为匹配位置
\(d[i]=b[m-i-1]\),即\(d[m-i-1]=b[i]\),
\[f[j]=\sum_{i=0}^{m-1}a[j+i]*d[m-i-1]=(a*d)(j+m-1)\]
计算卷积就好

char s[Maxn], t[Maxn];int q[Maxn], head, tail, tot[Maxn];void cal(char c){    memset(f, 0, sizeof(f)); memset(g, 0, sizeof(g));    head=1, tail=0;    for(int i=0; i < n; i++){        if(s[i] == c) q[++tail]=i;        while(head <= tail && q[head]+k < i) head++;        if(head <= tail) f[i].a=1;    }head=1, tail=0;    for(int i=n-1; i >= 0; i--) {        if(s[i] == c) q[++tail]=i;        while(head <= tail && q[head] > i+k) head++;        if(head <= tail) f[i].a=1;    }    for(int i=0; i < m; i++) if(t[i] == c) g[m-i-1].a=1;    FFT(f, 1); FFT(g, 1); for(int i=0; i < lim; i++) f[i]=f[i]*g[i]; FFT(f, -1);    for(int i=0; i < n; i++) tot[i]+=floor(f[i+m-1].a/lim+0.5);}void solve(){    n=read(), m=read(), k=read(); scanf("%s", s); scanf("%s", t);    while(lim <= n+m-2) lim<<=1, l++;    for(int i=0; i < lim; i++) r[i]=r[i>>1]>>1|((i&1)<
= m) ans++; printf("%d", ans);}

(我真是个小天才,用\(char\)来存数组\(orz\)

转载于:https://www.cnblogs.com/zerolt/p/9303013.html

你可能感兴趣的文章
Node.js学习-1
查看>>
今天你的应用崩溃了么?
查看>>
项目中的*签到*小功能!
查看>>
iOS 获取cell.accessoryView自定义视图以及点击事件
查看>>
java 考试试题
查看>>
[caffe(一)]使用caffe训练mnist数据集
查看>>
闭包,装饰器
查看>>
vs2013编译错误解决: _declspec(dllimport) 动态链接库
查看>>
这是一篇被河蟹了的博客
查看>>
一个两年Java的面试总结
查看>>
转:React Native之旅01-创建项目
查看>>
软件工程项目组Z.XML会议记录 2013/11/27
查看>>
科学计算库学习报告
查看>>
软件测试 -- 软件测试的风险主要体现在哪里
查看>>
修改App.config中的appSettings
查看>>
JQuery选择器总结
查看>>
Ubuntu中无法update的解决办法
查看>>
仿射变换
查看>>
decltype类型指示符
查看>>
虹软ArcFace人脸识别 与 Dlib 人脸识别对比
查看>>