【FFT-类字符串匹配】LOJ6388 [THUPC2018]赛艇 / Citing
【题目】
原题地址
给定一个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相关推荐
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)...
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FFT)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FF ...
- FFT字符串匹配(解决通配符问题)
FFT字符串匹配 定义字符串下标从000,开始,有文本串AAA长度为nnn,模式串BBB长度为mmm,我们可以考虑一个函数f(x,y)=A(x)−B(y)f(x, y) = A(x) - B(y)f( ...
- 「THUPC2018」赛艇 / Citing
https://loj.ac/problem/6388 矩形匹配,小地图经过位置为1,和大地图匹配不能同时存在一个1的位置,就可以是一个当前位置 1.bitset压位,....O(n^2m^2/64) ...
- 【字符串系列】字符串匹配中的位并行算法
[字符串系列]字符串匹配中的位并行算法 最近一段时间看了一点"柔性字符串匹配", 发现位并行算法在字符串匹配这个领域还是很有用的, 下面抒发一下鄙见. 首先, 字符串位并行算法在a ...
- java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配
java中字符串的精确匹配 在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 我们将专注于如何有效地处理字符串创建, 字符串更改和字符串匹配操作. ...
- Java最佳实践–字符串性能和精确字符串匹配
在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 我们将专注于如何有效地处理字符串创建, 字符串更改和字符串匹配操作. 此外,我们将提供我们自己的用 ...
- java 蓝桥杯算法提高 字符串匹配(题解)
试题 算法提高 字符串匹配 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时 ...
- 蛮力法 字符串匹配
字符串匹配是数据库开发和文字处理软件的关键.幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作.不过理解他们的原理还是比较重要的. 字符串算法主要可以分为几类.字符串匹配就是其中之一.当我们提 ...
- 字符串匹配问题 ----- KMP算法
题意: 任意给定一段字符串str("123abc123abc00abc") 再输入一个关键字key("abc") 要求返回str中包含key的所有子串的头下标 ...
最新文章
- JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章
- Linux OpenSSL获取证书指纹值(443、MD5、SHA1、SHA256)
- 用于快速排查Java的CPU性能问题(top us值过高)
- weblogic环境,应用上传图片报Could not initialize class sun.awt.X11.XToolkit
- Thinking in Java 11.3 添加一组元素
- Web前端常用IDE快捷键记忆(WebSorm、VSCode)
- oracle中的中文排序,Oracle下的中文排序
- android webview播放视频黑屏
- 啮齿类动物大尺度功能网络
- Flutter pageview indicator指示器实现
- 戴尔电脑重装系统的blos设置
- 快看快看,这款免费的低代码平台绝绝子
- ppsds.pgf是什么文件?
- Filter过滤器(超详细)
- [LTTng学习之旅]------环境搭建
- python儿童编程培训班-杭州靠谱的少儿编程辅导班-python
- 关于 reCAPTCHA 验证码
- Abp后台框架在编辑时异常处理
- 逻辑电平之常见差分逻辑电平
- 苹果亮度自动调节怎么关闭_一加8T升级到8192级自动亮度调节:安卓中最好
热门文章
- 编译内核报错 No rule to make target ‘debian/canonical-certs.pem‘ 或 ‘canonical-revoked-certs.pem‘ 的解决方法
- python炒股难度_诺贝尔奖得主教你如何分配炒股仓位 | python量化系列
- windows7操作系统安装步骤(精简版)
- NFT因无意义而美丽
- 移动研发平台EMAS 3.0全新升级,欢迎登陆阿里云官网搜索EMAS进行体验
- 1034-乘积小于 K 的子数组
- 2W+字系统讲解如何用Python自动化操作PPT,学懂这篇文章就够了
- 第04课:了解数据必备的文本可视化技巧
- Java获取国内手机号码归属地
- 转行做程序员,月薪过万需要多久?