bzoj 4503 两个串——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503
翻转T,就变成卷积。要想想怎么判断。
因为卷积是乘积求和,又想到相等的话相减为0,所以可以求和 s[ i ] - t[ j ] ,这样有一个不相等的求和就不是0了;但注意可以有负数,所以加一个平方上去就行了;
考虑通配符,需要只要有通配符值就是0;所以可以在那个平方的外面再乘一个t[ j ]。然后就正常卷积。
注意要输出方案!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
#define ll long long
using namespace std;
const int N=1e5+,M=N<<;
const db pi=acos(-);
int n,m,len,r[M],sm,ans,prn[N];
char ca[N],cb[N];
struct cpl{db x,y;}a[M],b[M],af[M],bf[M],I;
cpl operator+ (cpl a,cpl b){return (cpl){a.x+b.x,a.y+b.y};}
cpl operator- (cpl a,cpl b){return (cpl){a.x-b.x,a.y-b.y};}
cpl operator* (cpl a,cpl b){return (cpl){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
void fft(cpl *a,bool fx)
{
for(int i=;i<len;i++)
if(i<r[i])swap(a[i],a[r[i]]);
for(int R=;R<=len;R<<=)
{
int m=R>>;
cpl Wn=(cpl){ cos(pi/m),fx?-sin(pi/m):sin(pi/m) };
for(int i=;i<len;i+=R)
{
cpl w=I;
for(int j=;j<m;j++,w=w*Wn)
{
cpl tmp=w*a[i+m+j];
a[i+m+j]=a[i+j]-tmp;
a[i+j]=a[i+j]+tmp;
}
}
}
}
int main()
{
I.x=;
scanf("%s",ca); scanf("%s",cb);
n=strlen(ca); m=strlen(cb);
for(int i=m->>;i>=;i--)swap(cb[i],cb[m--i]);
for(int i=,d;i<m;i++)
{
if(cb[i]=='?')d=;
else d=cb[i]-'a'+;
b[i].x=d; bf[i].x=d*d; sm+=d*d*d;
}
for(int i=,d;i<n;i++)
{
d=ca[i]-'a'+;
a[i].x=d; af[i].x=d*d;
}
len=;
for(;len<=n+m;len<<=);
for(int i=;i<len;i++)r[i]=(r[i>>]>>)+((i&)?len>>:);
fft(a,); fft(b,); fft(af,); fft(bf,);
for(int i=;i<len;i++)b[i]=af[i]*b[i];
for(int i=;i<len;i++)a[i]=a[i]*bf[i];
fft(a,); fft(b,);
for(int i=m-;i<n;i++)
{
a[i].x/=len; b[i].x/=len;
db d=b[i].x-*a[i].x+sm;
if(abs(d)<0.5)prn[++ans]=i-m+;
}
printf("%d\n",ans);
for(int i=;i<=ans;i++)printf("%d\n",prn[i]);
return ;
}
bzoj 4503 两个串——FFT的更多相关文章
- BZOJ 4503: 两个串 [FFT]
4503: 两个串 题意:兔子们在玩两个串的游戏.给定两个只含小写字母的字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹 ...
- BZOJ.4503.两个串(FFT/bitset)
题目链接 \(Description\) 给定两个字符串S和T,求T在S中出现了几次,以及分别在哪些位置出现.T中可能有'?'字符,这个字符可以匹配任何字符. \(|S|,|T|\leq 10^5\) ...
- bzoj 4503 两个串 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 推式子即可: 不知怎的调了那么久,应该是很清晰的. 代码如下: #include< ...
- BZOJ 4503 两个串 ——FFT
[题目分析] 定义两个字符之间的距离为 (ai-bi)^2*ai*bi 如果能够匹配,从i到i+m的位置的和一定为0 但这和暴力没有什么区别. 发现把b字符串反过来就可以卷积用FFT了. 听说KMP+ ...
- bzoj 4503 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...
- 【刷题】BZOJ 4503 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹配任何字符. I ...
- BZOJ 4503 两个串(FFT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4503 [题目大意] 给出S串和T串,计算T在S中出现次数,T中有通配符'?'. [题解 ...
- bzoj 4503 两个串 快速傅里叶变换FFT
题目大意: 给定两个\((length \leq 10^5)\)的字符串,问第二个串在第一个串中出现了多少次.并且第二个串中含有单字符通配符. 题解: 首先我们从kmp的角度去考虑 这道题从字符串数据 ...
- bzoj 4503: 两个串【脑洞+FFT】
真实脑洞题 因为通配符所以导致t串实际有指数级别个,任何字符串相关算法都没有用 考虑一个新的匹配方法:设a串(模板串)长为n,从m串的i位置开始匹配:\( \sum_{i=0}^{n-1}(a[j]- ...
随机推荐
- 通过调节坐标进行jfree图的放大缩小
http://blog.csdn.net/lt1983lt/article/details/5665085 import Java.awt.BorderLayout;import java.awt.C ...
- android 加固防止反编译-重新打包
http://blog.csdn.net/u010921385/article/details/52505094 1.需要加密的Apk(源Apk) 2.壳程序Apk(负责解密Apk工作) 3.加密工具 ...
- PHP封装时间类
开发中经常用到时间的一些操作,比如昨天,今天,前天,近七天,一周等等. class time{ private $year;//年 private $month;//月 private $day;// ...
- php数组函数-array_intersect()
array_intersect()函数返回两个或多个数组的交集数组 结果数组包含了所有在被比较数组中,也同时出现在所有其他参数数组中 的值,键名保留不变 array_intersect(array1, ...
- Vue.js学习笔记 第三篇 条件渲染
条件选择 条件选择的用法和其他语言类似,一个例子就能解决所有问题 <!DOCTYPE html> <html> <head> <meta charset=&q ...
- ubuntu关闭631(cups)端口
在ubuntu17.04环境下使用nmap扫描自己机器,发现631端口处于开启状态,将其输入到浏览器,可以看出是网络打印机的服务: 这个端口开着总是那么的刺眼,(5.12全球爆发的勒索病毒让人不寒而栗 ...
- Python 字符串概念和操作
# 字符串概念:由单个字符串组成的一个集合 # 普通字符串(非原始字符串) str = "abc" print(str) # abc # 原始字符串(前面加r) str = r&q ...
- java基础(5)-集合类1
集合的由来 数组是很常用的一种数据结构,但假如我们遇到以下这样的的问题: 容器长度不确定 能自动排序 存储以键值对方式的数据 如果遇到这样的情况,数组就比较难满足了,所以也就有了一种与数组类似的数据结 ...
- sqoop1.4.6 全量导入与增量导入 与使用技巧
全量导入: sqoop import --connect jdbc:mysql://192.168.0.144:3306/db_blog --username root --password 1234 ...
- nodejs mysql 操作数据库方法一详解
nodejs mysql 数据查询例子 时间 2014-11-11 15:28:01 姜糖水原文 http://www.cnphp6.com/archives/59864 1.安装nodejs 2 ...