【题目】
原题地址
给定一个n×mn\times mn×m的010101矩阵,其中111不能走。给定一个人的行走路线,求所有可能的起点。

【解题思路】
我们考虑将走的路径看作111,然后将走出的路径补000成为一个n×mn\times mn×m矩阵。现在的问题就转化为在原矩阵中放一个矩阵,使得两个矩阵的或为000,求方案数。
将矩阵展开为一维后,实际上就是对应位置上的或值为000。
由于只有000和111,那么或运算和乘法运算是等价的。
于是将其中一个序列反转,做fftfftfft,这时候卷积中第iii位就代表下标和为iii的各项乘积,实际上就表示路径矩阵在原矩阵中起始位置为i−n×mi-n\times mi−n×m时,矩阵各项的乘积和。
于是现在看对应位置中有多少为为0即可。

【参考代码】

#include<bits/stdc++.h>
using namespace std;typedef double db;
const db pi=acos(-1);
const int N=5e6+10,M=N<<1;
int n,m,K,mxx,mix,mxy,miy,nx,ny,lim,L,ans;
int rev[M];
char s[N];struct cd
{db r,i;cd(){}cd(db r,db i):r(r),i(i){}cd operator + (const cd&x)const{return cd(r+x.r,i+x.i);}cd operator - (const cd&x)const{return cd(r-x.r,i-x.i);}cd operator * (const cd&x)const{return cd(r*x.r-i*x.i,r*x.i+i*x.r);}
}a[M],b[M];void fft(cd *a,int n,int f)
{for(int i=0;i<n;++i) if(i<rev[i]) swap(a[i],a[rev[i]]);for(int i=1;i<n;i<<=1){cd wn=cd(cos(pi/i),f*sin(pi/i));for(int j=0;j<n;j+=i<<1){cd w=cd(1,0);for(int k=0;k<i;++k,w=w*wn){cd 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=0;i<n;++i) a[i].r/=n;
}int main()
{#ifndef ONLINE_JUDGEfreopen("LOJ6388.in","r",stdin);freopen("LOJ6388.out","w",stdout);
#endifscanf("%d%d%d",&n,&m,&K);for(int i=0;i<n;++i){scanf("%s",s);for(int j=0;j<m;++j) a[i*m+j].r=s[j]=='1';}scanf("%s",s);for(int i=0;i<K;++i){if(s[i]=='w') --nx;else if(s[i]=='s') ++nx;else if(s[i]=='a') --ny;else ++ny;mxx=max(mxx,nx);mix=min(mix,nx);mxy=max(mxy,ny);miy=min(miy,ny); }nx=ny=0;mxx-=mix;mxy-=miy;b[-mix*m-miy].r=1;for(int i=0;i<K;++i){if(s[i]=='w') --nx;else if(s[i]=='s') ++nx;else if(s[i]=='a') --ny;else ++ny;b[(nx-mix)*m+(ny-miy)].r=1;}//for(int i=0;i<n;++i,puts("")) for(int j=0;j<m;++j) printf("%.0lf ",b[i*m+j].r);int t=n*m-1;for(L=0,lim=1;lim<=2*t;) lim<<=1,++L;for(int i=0;i<lim;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));reverse(b,b+t+1);/*for(int i=0;i<lim;++i) printf("%0.lf ",a[i].r); puts("");fft(a,lim,1);for(int i=0;i<lim;++i) printf("%0.lf ",a[i].r); puts("");fft(a,lim,-1);for(int i=0;i<lim;++i) printf("%0.lf ",a[i].r); puts("");*/fft(a,lim,1);fft(b,lim,1);for(int i=0;i<lim;++i) a[i]=a[i]*b[i];fft(a,lim,-1);for(int i=0;i<n-mxx;++i) for(int j=0;j<m-mxy;++j) if(a[t+i*m+j].r<0.5) ++ans;printf("%d",ans);return 0;
}

【总结】
一道转化模型的好题,有点类似fftfftfft解决字符串匹配问题。

【FFT-类字符串匹配】LOJ6388 [THUPC2018]赛艇 / Citing相关推荐

  1. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)...

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  2. 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FFT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FF ...

  3. FFT字符串匹配(解决通配符问题)

    FFT字符串匹配 定义字符串下标从000,开始,有文本串AAA长度为nnn,模式串BBB长度为mmm,我们可以考虑一个函数f(x,y)=A(x)−B(y)f(x, y) = A(x) - B(y)f( ...

  4. 「THUPC2018」赛艇 / Citing

    https://loj.ac/problem/6388 矩形匹配,小地图经过位置为1,和大地图匹配不能同时存在一个1的位置,就可以是一个当前位置 1.bitset压位,....O(n^2m^2/64) ...

  5. 【字符串系列】字符串匹配中的位并行算法

    [字符串系列]字符串匹配中的位并行算法 最近一段时间看了一点"柔性字符串匹配", 发现位并行算法在字符串匹配这个领域还是很有用的, 下面抒发一下鄙见. 首先, 字符串位并行算法在a ...

  6. java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配

    java中字符串的精确匹配 在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 我们将专注于如何有效地处理字符串创建, 字符串更改和字符串匹配操作. ...

  7. Java最佳实践–字符串性能和精确字符串匹配

    在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 我们将专注于如何有效地处理字符串创建, 字符串更改和字符串匹配操作. 此外,我们将提供我们自己的用 ...

  8. java 蓝桥杯算法提高 字符串匹配(题解)

    试题 算法提高 字符串匹配 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时 ...

  9. 蛮力法 字符串匹配

    字符串匹配是数据库开发和文字处理软件的关键.幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作.不过理解他们的原理还是比较重要的. 字符串算法主要可以分为几类.字符串匹配就是其中之一.当我们提 ...

  10. 字符串匹配问题 ----- KMP算法

    题意: 任意给定一段字符串str("123abc123abc00abc") 再输入一个关键字key("abc") 要求返回str中包含key的所有子串的头下标 ...

最新文章

  1. JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章
  2. Linux OpenSSL获取证书指纹值(443、MD5、SHA1、SHA256)
  3. 用于快速排查Java的CPU性能问题(top us值过高)
  4. weblogic环境,应用上传图片报Could not initialize class sun.awt.X11.XToolkit
  5. Thinking in Java 11.3 添加一组元素
  6. Web前端常用IDE快捷键记忆(WebSorm、VSCode)
  7. oracle中的中文排序,Oracle下的中文排序
  8. android webview播放视频黑屏
  9. 啮齿类动物大尺度功能网络
  10. Flutter pageview indicator指示器实现
  11. 戴尔电脑重装系统的blos设置
  12. 快看快看,这款免费的低代码平台绝绝子
  13. ppsds.pgf是什么文件?
  14. Filter过滤器(超详细)
  15. [LTTng学习之旅]------环境搭建
  16. python儿童编程培训班-杭州靠谱的少儿编程辅导班-python
  17. 关于 reCAPTCHA 验证码
  18. Abp后台框架在编辑时异常处理
  19. 逻辑电平之常见差分逻辑电平
  20. 苹果亮度自动调节怎么关闭_一加8T升级到8192级自动亮度调节:安卓中最好

热门文章

  1. 编译内核报错 No rule to make target ‘debian/canonical-certs.pem‘ 或 ‘canonical-revoked-certs.pem‘ 的解决方法
  2. python炒股难度_诺贝尔奖得主教你如何分配炒股仓位 | python量化系列
  3. windows7操作系统安装步骤(精简版)
  4. NFT因无意义而美丽
  5. 移动研发平台EMAS 3.0全新升级,欢迎登陆阿里云官网搜索EMAS进行体验
  6. 1034-乘积小于 K 的子数组
  7. 2W+字系统讲解如何用Python自动化操作PPT,学懂这篇文章就够了
  8. 第04课:了解数据必备的文本可视化技巧
  9. Java获取国内手机号码归属地
  10. 转行做程序员,月薪过万需要多久?