【BZOJ4259】残缺的字符串 FFT
【BZOJ4259】残缺的字符串
Description
Input
Output
Sample Input
a*b
aebr*ob
Sample Output
2
1 5
题解:我们令?代表的T值=0,然后设出这样一个式子

这样一来,只要T和S在j位置匹配,当且仅当Dj=0,然后我们将这个式子拆开,变成下面那样

然后将T反转,就变成了卷积的形式,分别将它们6个求出来计算就好了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#define pi acos(-1.0)
using namespace std;
struct cp
{
double x,y;
cp (double a,double b){x=a,y=b;}
cp (){}
cp operator + (cp a){return cp(x+a.x,y+a.y);}
cp operator - (cp a){return cp(x-a.x,y-a.y);}
cp operator * (cp a){return cp(x*a.x-y*a.y,x*a.y+y*a.x);}
}n1[1<<20],n2[1<<20],n3[1<<20],n4[1<<20],n5[1<<20],n6[1<<20];
int n,m,top;
char s1[1<<20],s2[1<<20];
int s[1<<20],t[1<<20],sta[1<<20];
void FFT(cp *a,int len,int f)
{
int i,j,k,h;
cp t;
for(i=k=0;i<len;i++)
{
if(i>k) swap(a[i],a[k]);
for(j=(len>>1);(k^=j)<j;j>>=1);
}
for(h=2;h<=len;h<<=1)
{
cp wn(cos(f*2*pi/h),sin(f*2*pi/h));
for(j=0;j<len;j+=h)
{
cp w(1,0);
for(k=j;k<j+h/2;k++) t=w*a[k+h/2],a[k+h/2]=a[k]-t,a[k]=a[k]+t,w=w*wn;
}
}
}
int main()
{
scanf("%d%d%s%s",&m,&n,s2,s1);
int i,len=1;
while(len<n+m) len<<=1;
for(i=0;i<n;i++) s[i]=(s1[i]=='*')?0:(s1[i]-'a'+1);
for(i=0;i<m;i++) t[m-i-1]=(s2[i]=='*')?0:(s2[i]-'a'+1);
for(i=0;i<n;i++) n1[i]=cp(s[i]*s[i]*s[i],0),n2[i]=cp(-2*s[i]*s[i],0),n3[i]=cp(s[i],0);
for(i=0;i<m;i++) n4[i]=cp(t[i],0),n5[i]=cp(t[i]*t[i],0),n6[i]=cp(t[i]*t[i]*t[i],0);
FFT(n1,len,1),FFT(n2,len,1),FFT(n3,len,1),FFT(n4,len,1),FFT(n5,len,1),FFT(n6,len,1);
for(i=0;i<len;i++) n1[i]=n1[i]*n4[i]+n2[i]*n5[i]+n3[i]*n6[i];
FFT(n1,len,-1);
for(i=0;i<n-m+1;i++) if(!(int)(n1[i+m-1].x/len+0.1)) sta[++top]=i+1;
printf("%d\n",top);
for(i=1;i<top;i++) printf("%d ",sta[i]);
if(top) printf("%d",sta[top]);
return 0;
}
【BZOJ4259】残缺的字符串 FFT的更多相关文章
- BZOJ4259:残缺的字符串(FFT)
		
Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同 ...
 - BZOJ4259: 残缺的字符串(FFT 字符串匹配)
		
题意 题目链接 Sol 知道FFT能做字符串匹配的话这就是个裸题了吧.. 考虑把B翻转过来,如果\(\sum_{k = 0}^M (B_{i - k} - A_k)^2 * B_{i-k}*A_k = ...
 - luoguP4173 残缺的字符串 FFT
		
luoguP4173 残缺的字符串 FFT 链接 luogu 思路 和昨天做的题几乎一样. 匹配等价于(其实我更喜欢fft从0开始) \(\sum\limits_{i=0}^{m-1}(S[i+j]- ...
 - Luogu P4173 残缺的字符串-FFT在字符串匹配中的应用
		
P4173 残缺的字符串 FFT在字符串匹配中的应用. 能解决大概这种问题: 给定长度为\(m\)的A串,长度为\(n\)的B串.问A串在B串中的匹配数 我们设一个函数(下标从\(0\)开始) \(C ...
 - P4173 残缺的字符串(FFT字符串匹配)
		
P4173 残缺的字符串(FFT字符串匹配) P4173 解题思路: 经典套路将模式串翻转,将*设为0,设以目标串的x位置匹配结束的匹配函数为\(P(x)=\sum^{m-1}_{i=0}[A(m-1 ...
 - BZOJ 4259: 残缺的字符串 [FFT]
		
4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...
 - CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串
		
Fuzzy Search 给你文本串 S 和模式串 T,求 S 的每个位置是否能模糊匹配上 T. 这里的模糊匹配指的是把 T 放到 S 相应位置上之后,T 中每个字符所在位置附近 k 个之内的位置上的 ...
 - 洛谷 P4173 残缺的字符串 (FFT)
		
题目链接:P4173 残缺的字符串 题意 给定长度为 \(m\) 的模式串和长度为 \(n\) 的目标串,两个串都带有通配符,求所有匹配的位置. 思路 FFT 带有通配符的字符串匹配问题. 设模式串为 ...
 - BZOJ4259 残缺的字符串(FFT)
		
两个串匹配时相匹配的位置位置差是相同的,那么翻转一个串就变成位置和相同,卷积的形式. 考虑如何使用卷积体现两个位置能否匹配.一个暴力的思路是每次只考虑一种字符,将其在一个串中设为1,并在另一个串中将不 ...
 
随机推荐
- oracle  事务多表查询以及额外的用处
			
/* 以下代码是对emp表进行显示宽度设置*/ col empno for 9999;col ename for a10;col job for a10;col mgr for 9999;col hi ...
 - 解决 TextMate 2 无法安装 Emmet 插件
			
本篇文章由:http://xinpure.com/solving-textmate-2-cannot-install-emmet-plugin/ 前端神器 Emmet 插件原名为 ZedCoding ...
 - Objective-C之定义函数
			
Demo1.m 一个基础的函数定义 #import<Foundation/Foundation.h> //定义一个返回值为int类型的,名为max的函数.传入的参数为两个int型数据 in ...
 - OZ Report  오즈 리포트 개발
			
//这只单元格数据颜色 if( (int)getattr("caption") > 100) setattr("bgcolor", "$0,0, ...
 - 【JAVA设计模式】外观模式(Facade Pattern)
			
一 定义 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用. 二 案例 一个子系统中拥有3个模块.每一个模块中都有3个方法.当中 ...
 - Java Web框架play framework的下载与环境变量配置
			
Web项目的开发有着众多的框架,近期刚刚接触了play. 对于一个Java开发者来说,play是一个不可多得的好框架.以下我简介下怎样下载play .以及play的环境变量配置方法. (1)登录pla ...
 - mongodb 安装部署说明
			
mongodb.conf 配置文件 # Where the databases will be stored dbpath=/usr/local/mongodb/mongodb-/data/db # ...
 - 什么是ETag
			
ETag 是 Entity Tag 的缩写,中文译过来就是实体标签的意思.在HTTP1.1协议中其实就是请求HEAD中的一个属性而已. HTTP/1.1 200 OK Date: Mon, 23 Ma ...
 - 给input元素换样式
			
浏览器默认的<input type="file">真是巨丑无比,搜了很多之后知道原来是可以把这个设置成透明的! 不过这样比较麻烦,需要将input标签对应的区域设置成和 ...
 - spring junit 部署两套测试方案
			
第一套方案: 1.初始化application:使用@ContextConfigurationr的classpath属性,如 @ContextConfiguration(locations = { & ...