bzoj 4259: 残缺的字符串

  这题好神啊,居然是fft,表示一直在往数据结构上想。

  把'*'当成0,那么两个串可以匹配当且仅当$$\sum (a[i]-b[i])^2\times a[i]\times b[i]==0$$

  我们可以把平方拆开,然后就变成了几个乘积相加的形式,那就大力翻转一个串然后跑FFT。

  因为最开始MLE了所以复制粘贴了好多东西。

  

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<cmath>
  6 #define N 1200005
  7 #define M 300005
  8 #define pi acos(-1)
  9 #define E complex
 10 using namespace std;
 11 struct complex
 12 {
 13     double x,y;
 14     complex(double _x,double _y){x=_x;y=_y;}
 15     complex(){;}
 16     friend complex operator * (const complex &a,const complex &b)
 17     {
 18         complex c;c.x=a.x*b.x-a.y*b.y;c.y=a.x*b.y+a.y*b.x;return c;
 19     }
 20     friend complex operator / (complex a,double b)
 21     {
 22         return complex(a.x/b,a.y/b);
 23     }
 24     friend complex operator + (complex a,complex b)
 25     {
 26         return complex(a.x+b.x,a.y+b.y);
 27     }
 28     friend complex operator - (complex a,complex b)
 29     {
 30         return complex(a.x-b.x,a.y-b.y);
 31     }
 32 };
 33 int R[N];int n;
 34 void fft(E *a,int f)
 35 {
 36     for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
 37     for(int i=1;i<n;i<<=1)
 38     {
 39         E wn(cos(pi/i),f*sin(pi/i));
 40         for(int j=0;j<n;j+=(i<<1))
 41         {
 42             E w(1,0);
 43             for(int k=0;k<i;k++,w=w*wn)
 44             {
 45                 E x=a[j+k],y=w*a[j+k+i];
 46                 a[j+k]=x+y;a[j+k+i]=x-y;
 47             }
 48         }
 49     }
 50     if(f==-1)for(int i=0;i<n;i++)a[i]=a[i]/n;
 51 }
 52 int nn,mm;
 53 char s1[M],s2[M],s3[M];
 54 E a1[N],b1[N],c1[N];
 55 int ans[N];
 56 int st[M],top;
 57 int main()
 58 {
 59     scanf("%d%d",&nn,&mm);
 60     scanf("%s",s3);scanf("%s",s2);
 61     int l=0;
 62     for(n=1;n<2*mm;n<<=1)l++;
 63     for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(l-1));
 64     for(int i=0;i<nn;i++)s1[i]=s3[nn-i-1];
 65     for(int i=0;i<mm;i++)
 66     {
 67         int tmp=s2[i]-'a'+1;double p=tmp+0.0;
 68         if(s2[i]=='*')p=0;
 69         b1[i].x=p;
 70     }
 71     for(int i=0;i<nn;i++)
 72     {
 73         int tmp=s1[i]-'a'+1;double p=tmp+0.0;
 74         if(s1[i]=='*')p=0;
 75         a1[i].x=p*p*p;
 76     }
 77     fft(a1,1);fft(b1,1);
 78     for(int i=0;i<n;i++)c1[i]=a1[i]*b1[i];
 79     for(int i=0;i<n;i++)a1[i].x=a1[i].y=b1[i].x=b1[i].y=0;
 80     
 81     for(int i=0;i<mm;i++)
 82     {
 83         int tmp=s2[i]-'a'+1;double p=tmp+0.0;
 84         if(s2[i]=='*')p=0;
 85         b1[i].x=p*p;
 86     }
 87     for(int i=0;i<nn;i++)
 88     {
 89         int tmp=s1[i]-'a'+1;double p=tmp+0.0;
 90         if(s1[i]=='*')p=0;
 91         a1[i].x=p*p;
 92     }
 93     fft(a1,1);fft(b1,1);
 94     for(int i=0;i<n;i++)c1[i]=c1[i]-(a1[i]*b1[i]),c1[i]=c1[i]-(a1[i]*b1[i]);
 95     for(int i=0;i<n;i++)a1[i].x=a1[i].y=b1[i].x=b1[i].y=0;
 96 
 97     for(int i=0;i<mm;i++)
 98     {
 99         int tmp=s2[i]-'a'+1;double p=tmp+0.0;
100         if(s2[i]=='*')p=0;
101         b1[i].x=p*p*p;
102     }
103     for(int i=0;i<nn;i++)
104     {
105         int tmp=s1[i]-'a'+1;double p=tmp+0.0;
106         if(s1[i]=='*')p=0;
107         a1[i].x=p;
108     }
109     fft(a1,1);fft(b1,1);
110     for(int i=0;i<n;i++)c1[i]=c1[i]+(a1[i]*b1[i]);
111     
112     fft(c1,-1);
113 
114     for(int i=nn-1;i<mm;i++)
115     {
116         if(fabs(c1[i].x)<0.5)
117         {
118             st[++top]=i-nn+2;
119         }
120     }
121     printf("%d\n",top);
122     for(int i=1;i<=top;i++)
123     {
124         if(i!=top)printf("%d ",st[i]);
125         else printf("%d\n",st[i]);
126     }
127     return 0;
128 }

 

转载于:https://www.cnblogs.com/ezyzy/p/6511727.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

录屏时计算机休眠,硬盘录像机里硬盘提示休眠,什么意思?

休眠&#xff0c;电脑内存中的数据写入硬盘&#xff0c;关闭电脑。重新启动的时候重新将数据加载到内存中&#xff0c;恢复休眠前状态。睡眠&#xff0c;和休眠一个意思&#xff0c;98系统下叫睡眠。xp系统叫休眠。98系统睡眠时&#xff0c;内存数据写入虚拟内存&#xff0c;xp…

MySQL数据库的基本操作

-- 连接mysql 数据库(前提是配置好MySQL数据库的环境变量&#xff0c;加入path)mysql -uroot -p -- 设置文本的输入输出编码&#xff1a;cmd 使用的是gbk&#xff0c;不然显示乱码set names gbk; -- 创建数据库create database mydatabase charset utf8; -- 创建用户 user001cr…

使用NoSQL实施实体服务–第5部分:使用云提高自治性

在先前的文章中&#xff0c;我讨论了如何通过结合使用Java Web Services &#xff0c; Java EE和CouchDB NoSQL数据库为产品构建SOA“实体”服务。 在本系列的最后一篇文章中&#xff0c;我将利用我已经创建的一些技术资产&#xff0c;并使用一些流行的SOA模式实现一些新的用户…

乐高计算机发展史教程,【乐高产品发展史特别篇】乐高恐龙发展史

—— 写在前面 ——2018年6月22日&#xff0c;《侏罗纪世界2&#xff1a;失落王国》全球上映&#xff1b;4月16日&#xff0c;乐高同名系列套装全球发售。恐龙是一个伴随了乐高产品二十余年的主题&#xff0c;其实在一年以前就有这样一个计划完成乐高恐龙发展史的相关内容&…

mvc 连接数据库但单复值得问题

1. The model backing the ‘MusicStoreDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database Movie这个表是用来记录Model的版本号的&#xff0c;你每次重新生成一次数据库它就会重新给ModelHash…

Mybatis处理表关联(懒加载)

1.关系型数据库&#xff1f; 数据库中的表对象之间是有关系的。 一对一&#xff0c;一对多&#xff0c;多对多。 ORM映射。数据库表映射到实体对象。 实体与实体之间是有关系的。 一对多的关系。 比如商品分类表与商品表之间的关系&#xff0c;就是一对多的关系。 入库主表与入…

Spring–设计领域模型和服务层

我们将为时间表管理构建应用程序。 因此&#xff0c;让我们首先考虑一些用例和实体。 让我用几个项目符号写它们&#xff1a; 任务由经理分配给员工。 一项任务可以分配给许多员工。 员工将他在某些任务上工作的小时数填满至系统。 经理/员工查看时间表上的报告&#xff08;时…

如何把很多照片拼成一张照片_一张现场照片引发的中韩之争

来源&#xff1a;渤海新水手聊船专栏前几天&#xff0c;微信群里(造船质量技术高级交流群)一位网友发了一张韩国船厂的现场照片&#xff0c;没想到瞬间引发全群几十位网友的热烈讨论&#xff0c;中韩之争就此上演&#xff01;照片反映出的是国内船厂很难做到的部分——分段预装…

计算机文档设置,电脑这样设置快速的共享文件、分享文档!

原标题&#xff1a;电脑这样设置快速的共享文件、分享文档&#xff01;在日常办公的时候&#xff0c;有时需要共同使用一些文件或者文档或者一些视频资料。那么要怎么方便的使用这些共同的资源呢&#xff1f;当然这时大家可能会说可以用QQ、微信传给对方不就可以了。但是如果文…

关于vue 框架与后台框架的混合使用的尝试

这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 php 的 lumen 框架,他是laravel 的简化版,因为比较轻量,所以这也是我的选择; 先说下我这边的环境:…

GitHub上整理的一些工具

GitHub上整理的一些工具 GitHub 2015-11-19 10:10:47 发布您的评价: 0.0 收藏 5收藏技术站点 Hacker News&#xff1a;非常棒的针对编程的链接聚合网站Programming reddit&#xff1a;同上MSDN&#xff1a;微软相关的官方技术集中地&#xff0c;主要是文档类infoq&#x…

服务器 raid 1t硬盘吗,用了4块1T的硬盘,做了raid5,显示有2.7T,但是分区做完系统后,有700多G不能动...

满意答案ouourpt892013.11.14采纳率&#xff1a;46% 等级&#xff1a;12已帮助&#xff1a;13583人出现这种情况是由于创建的硬盘使用的是基本磁盘(MBR)格式&#xff0c;因受MBR磁盘格式技术的限制&#xff0c;MBR磁盘只支持2TB的磁盘容量&#xff0c;所以出现了你所说的情况…

如何编写更好的POJO服务

在Java中&#xff0c;您可以轻松地在Plain Old Java Object&#xff08;POJO&#xff09;类中实现一些业务逻辑&#xff0c;并且可以在高级服务器或框架中轻松运行它们。 有许多服务器/框架&#xff0c;例如JBossAS&#xff0c;Spring或Camel等&#xff0c;它们使您可以部署POJ…

mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解

1 mongoDB索引的管理本节介绍mongoDB中的索引&#xff0c;熟悉mysql/sqlserver等关系型数据库的小伙伴应该都知道索引对优化数据查询的重要性。我们先简单了解一下索引&#xff1a;索引的本质就是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据(数据…

HBase MapReduce

1. HBase to HBase Mapper 继承 TableMapper&#xff0c;输入为Rowkey和Result. public abstract class TableMapper<KEYOUT, VALUEOUT> extends Mapper<ImmutableBytesWritable, Result, KEYOUT, VALUEOUT> { public TableMapper() { }} package com.scb.ja…

第六期的知识点

1.volatile详解 在应用程序中&#xff0c;volatile主要是被设计用来修饰被不同线程访问和修改的变量 .volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化&#xff0c;但有可能会读脏数据。当要求使用volatile声明变量值…

在DelayQueue中更改延迟,从而更改顺序

因此&#xff0c;我正在研究构建一个简单的对象缓存&#xff0c;该缓存在给定时间后会使对象过期。 显而易见的机制是使用Java并发包中的DelayedQueue类。 但我想知道是否有可能在将对象添加到队列后更新延迟。 看一下Delayed接口&#xff0c;似乎没有充分的理由不在文档中&…

vi编辑器服务器维护,vi编辑器有哪几种工作模式及如何转换_网站服务器运行维护,vi编辑器,工作模式...

整理分享一些 Linux思维导图(值得收藏)_网站服务器运行维护本篇文章整理分享了一些 Linux思维导图(值得收藏)。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。vi编辑器有三种基本的工作模式&#xff0c;分别是&#xff1a;指令行模式、…

(八)cmockery中的calculator和run_tests函数的注释代码

所分析的calculator.c和calculator_test.c文件位于 工程中的 cmockery/src/example/ 目录下&#xff0c;是一个相对而言比较全面的样例程序&#xff0c;用到了cmockery项目中的大多数单元测试方法。基本上涵盖了之前所有的样例程序中的用法&#xff0c;还有两组测试是database操…

家用双wan口路由器推荐_请推荐双WAN口的有线千兆硬路由器?

利益相关&#xff1a;TP-LINK一线销售人员(来看看会不会有推荐我司产品的2333 )路由器&#xff1a;TL-ER3220G&#xff0c;带机量300终端&#xff0c;可管理50个AP&#xff0c;最大支持四条宽带接入POE交换机&#xff1a;TL-SF1005P(5口百兆) TL-SG1005P(5口千兆) TL-SF1009PH(…