https://loj.ac/problem/6388

如果你做过BZOJ5217:[Lydsy2017省队十连测]航海舰队的话,那么恭喜你,这道题就是大水题。

如果你做过BZOJ4259:残缺的字符串的话,那么基本的字符串匹配FFT也是能想到的。

如果没做过的话,很抱歉,没有一定的套路的话这道题很难想(而对于我这样的蒟蒻来说就是没法想。)

将行走路线看做一个地图b,走过的路为1,没走的为0.

于是可以变成这张地图可以与原地图a匹配多少次(匹配成功在于两张图的1不能重叠。)

按照BZOJ5217的套路,将二维压成一维,就变成了对于一个下标为p的点,不满足a[p+i]=1且b[i]=1。

于是有f[i]=sigma(a[i+j]*b[j])=0,将a数组颠倒得f[i]=sigma(a[n*m-i-j]*b[j])=0是卷积,可以FFT运算。

最后统计f[i]=0的个数即可。

  1. #include<map>
  2. #include<cmath>
  3. #include<stack>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<cctype>
  7. #include<vector>
  8. #include<cstdlib>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. using namespace std;
  13. typedef double dl;
  14. const dl pi=acos(-1.0);
  15. const dl eps=0.5;
  16. const int M=;
  17. const int N=M*M*;
  18. const int K=5e6+;
  19. struct complex{
  20. dl x,y;
  21. complex(dl xx=,dl yy=){
  22. x=xx;y=yy;
  23. }
  24. complex operator +(const complex &b)const{
  25. return complex(x+b.x,y+b.y);
  26. }
  27. complex operator -(const complex &b)const{
  28. return complex(x-b.x,y-b.y);
  29. }
  30. complex operator *(const complex &b)const{
  31. return complex(x*b.x-y*b.y,x*b.y+y*b.x);
  32. }
  33. };
  34. void FFT(complex a[],int n,int on){
  35. for(int i=,j=n>>;i<n-;i++){
  36. if(i<j)swap(a[i],a[j]);
  37. int k=n>>;
  38. while(j>=k){j-=k;k>>=;}
  39. if(j<k)j+=k;
  40. }
  41. for(int i=;i<=n;i<<=){
  42. complex res(cos(-*on*pi/i),sin(-*on*pi/i));
  43. for(int j=;j<n;j+=i){
  44. complex w(,);
  45. for(int k=j;k<j+i/;k++){
  46. complex u=a[k],t=w*a[k+i/];
  47. a[k]=u+t;a[k+i/]=u-t;
  48. w=w*res;
  49. }
  50. }
  51. }
  52. if(on==-)
  53. for(int i=;i<n;i++)a[i].x/=n;
  54. }
  55. bool tmp[M*+][M*+];
  56. int n,m,k;
  57. char mp[M][M],s[K];
  58. complex a[N],b[N];
  59. int main(){
  60. scanf("%d%d%d",&n,&m,&k);
  61. for(int i=;i<=n;i++)scanf("%s",mp[i]+);
  62.  
  63. for(int i=;i<=n;i++)
  64. for(int j=;j<=m;j++)
  65. if(mp[i][j]=='')a[n*m-(i-)*m-j]=complex(,);
  66.  
  67. scanf("%s",s);
  68. int x=n,y=m;
  69. int x1=n,y1=m,x2=n,y2=m;
  70. tmp[x][y]=;
  71. for(int i=;i<k;i++){
  72. if(s[i]=='w')x--;
  73. if(s[i]=='a')y--;
  74. if(s[i]=='s')x++;
  75. if(s[i]=='d')y++;
  76. tmp[x][y]=;
  77. x1=min(x1,x),y1=min(y1,y),x2=max(x2,x),y2=max(y2,y);
  78. }
  79. for(int i=x1;i<=x2;i++)
  80. for(int j=y1;j<=y2;j++)
  81. if(tmp[i][j])b[(i-x1)*m+j-y1]=complex(,);
  82.  
  83. int len=;
  84. while(len<n*m)len<<=;
  85. FFT(a,len,);FFT(b,len,);
  86. for(int i=;i<len;i++)a[i]=a[i]*b[i];
  87. FFT(a,len,-);
  88.  
  89. int ans=;
  90. for(int i=;i<=n-(x2-x1);i++)
  91. for(int j=;j<=m-(y2-y1);j++)
  92. if(a[n*m-(i-)*m-j].x<eps)ans++;
  93. printf("%d\n",ans);
  94. return ;
  95. }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

LOJ6388:[THUPC2018]赛艇——题解的更多相关文章

  1. [loj6388] 「THUPC2018」赛艇 / Citing

    Description ​ 给你一个\(~n \times m~\)的\(~01~\)矩阵,一个人在这个矩阵中走了\(~k~\)步,每一次都往四联通方向中的一个走一步.给定这个人每一步走的方向,已知这 ...

  2. 【题解】P5446 [THUPC2018]绿绿和串串(manacher)

    [题解]P5446 [THUPC2018]绿绿和串串(manacher) 考虑对于一个串进行\(f\)操作,就是让他变成一个以最后一个节点为回文中心的回文串. 那么对于某个位置\(p\),假如它是一个 ...

  3. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  4. 「THUPC2018」赛艇 / Citing

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

  5. THUPC2018看题总结

    THUPC2018看题总结 #6387. 「THUPC2018」绿绿与串串 / String 据说是签到题啊. 首先根据题目的意思,我们发现如果能找到那个最后一次选择的对称轴岂不是美滋滋. 自然地,我 ...

  6. cojs DAG计数问题1-4 题解报告

    最近突然有很多人来问我这些题目怎么做OwO 然而并不是我出的,结论我也不是很懂 研究了一下觉得非常的一颗赛艇,于是就打算写这样一篇题解 DAG 1 我们考虑DAG的性质,枚举出度为0的点 设出度为0的 ...

  7. OI队测题解:

    Test 17   T1: 题目大意: 喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树. 所有星球间的双向航线的长度都为1.小昕要在若干个星球建矿石仓库,设立每个仓库的费用为K.对于未 ...

  8. 【BZOJ4584】[Apio2016]赛艇 DP

    [BZOJ4584][Apio2016]赛艇 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到.每个学校都拥有若干艘划艇.同一所学校的所 ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. 抽样分布(3) F分布

    定义 设U~χ2(n1), V~χ2(n2),且U,V相互独立,则称随机变量 服从自由度为(n1,n2)的F分布,记为F~F(n1,n2),其中n1叫做第一自由度,n2叫做第二自由度. F分布的概率密 ...

  2. 在Win10中通过命令行打开UWP应用

    近期由于需要在WinX菜单中添加几个UWP应用,但发现很难找到相应的命令行,Universal Apps 的快捷方式属性里也没有. 于是到网上搜了很久才找到一个E文的页面,试了一下确实可行,分享给大家 ...

  3. C#新特性记录

    C#6.0新特性笔记 Getter专属赋值 可以在构造函数中,给只有get的属性赋初始值. class Point { public int x { get; } public Point() { x ...

  4. 「赛后补题」Meeting(HDU-5521)

    题意 A,B两个人分别在1和n区.每个区有若干点(区之间的点可以重复,各个区内点间的距离一致),给出区之间有联系的图以及到达所需时间.求两个人见面最短时间以及在哪个区碰面(可有多个) 分析 隐式图搜索 ...

  5. [SHELL]结构化命令之条件语句

    1.if-then语句  #!/bin/bash username="root" if grep $username /etc/passwd then echo "the ...

  6. python程序设计——面向对象程序设计:类

    理解面向对象 基本原则是,计算机程序由多个能够起到子程序作用的单元或对象组合而成 关键性观念是,数据以及对数据的操作封装在一起,组成一个相互依存.不可分割的整体,即对象 python面向对象特性 完全 ...

  7. CSS 之 选择器

    CSS的常见选择器 一.简单选择器 Simple Selectors 选择器 含义 * 通用元素选择器,匹配任何元素 E 标签选择器,匹配所有使用E标签的元素 .info class选择器,匹配所有c ...

  8. 解决CentOS: Failed to start The Apache HTTP Server.

    使用systemctl status httpd.service命令查看服务状态,发现有报错 然后将此配置文件/etc/httpd/conf.d/wordpress.conf的内容全部清空,修改为: ...

  9. geth账户密码

    xiaocong geth账户密码 123 {d6abe909013d8da914ae2a08c9b58e7b76601b39} 账户密码 123456 0x4A7F15104F54dB3214D2F ...

  10. 五:ResourceManager High Availability RM 高可用

    RM有单点失败的风险,但是可以做HA.  RMs HA通过master/standby这种结构实现,一个master是active的,其它standby是inactive的.可能通过命令行切换主备节点 ...