bzoj 4503
没有权限号就只能对拍了
我们令?代表的T值=0,然后设出这样一个式子
这样一来,只要T和S在j位置匹配,当且仅当Dj=0,然后我们将这个式子拆开,变成下面那样
思路大概就是这样
最后发现答案应该是在ans[lens2-1]---------ans[lens1-1]之间的
翻转字符用FFT优化是一种常见策略
代码:
#include <bits/stdc++.h>
using namespace std;
#define dob complex<double>
const double pi = acos(-1.0);
const int N = 6e4*;
int n, m, l, r[N+], sum[N+],ans[N+];
dob a[N+], b[N+],a1[N+],b1[N+];
void fft(dob *a,int o)
{
for (int i=;i<n;i++)
if (i>r[i]) swap(a[i],a[r[i]]);
for (int i=;i<n;i*=)
{
dob wn(cos(pi/i),sin(pi*o/i)),x,y;
for (int j=;j<n;j+=(i*))
{
dob w(,);
for (int k=;k<i;k++,w*=wn)
{
x=a[j+k]; y=w*a[i+j+k];
a[j+k]=x+y,a[i+j+k]=x-y;
}
}
}
}
char s1[N],s2[N];
void query()
{
l=;
for (n = ; n <= m; n <<= ) l++;
for (int i=;i<n;i++) r[i]=(r[i/]/)|((i&)<<(l-));
fft(a,),
fft(b,);
for (int i=;i<n;i++) a[i]*=b[i];
fft(a,-);
for (int i=;i<=m;i++) sum[i]=int (a[i].real()/n+0.5);
}
void clearr()
{
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(sum,,sizeof(sum));
}
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
ios::sync_with_stdio(false);
cin>>s1>>s2;
for (int i=;i<strlen(s1);i++)
a1[strlen(s1)-i-]=s1[i]-' ';
for (int i=;i<strlen(s2);i++)
if (s2[i]=='?') b[i]=;
else b1[i]=s2[i]-' ';
n=max(strlen(s1),strlen(s2)); n--; m=n*;
clearr();
for (int i=;i<strlen(s1);i++)
a[i]=a1[i]*a1[i];
for (int i=;i<strlen(s2);i++)
b[i]=b1[i];
// cout<<b1[0].real();
// cout<<a1[0].real()<<" "<<a[0].real()<<endl;
query();
for (int i=;i<=m;i++) ans[i]+=sum[i];
clearr();
// cout<<b1[0].real();
for (int i=;i<strlen(s1);i++)
a[i]=a1[i];
for (int i=;i<strlen(s2);i++)
b[i]=b1[i]*b1[i];
query();
for (int i=;i<=m;i++) ans[i]-=*sum[i];
int sum2=;
for (int i=;i<strlen(s2);i++)
sum2+=pow(b1[i].real(),);
for (int i=;i<=m;i++)
ans[i]+=sum2;
int ans1=;
for (int i=strlen(s2)-;i<=strlen(s1)-;i++)
if (!ans[i]) ans1++;
cout<<ans1<<endl;
}
bzoj 4503的更多相关文章
- BZOJ 4503 两个串(FFT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4503 [题目大意] 给出S串和T串,计算T在S中出现次数,T中有通配符'?'. [题解 ...
- BZOJ 4503: 两个串 [FFT]
4503: 两个串 题意:兔子们在玩两个串的游戏.给定两个只含小写字母的字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹 ...
- 【BZOJ 4503】4503: 两个串 (FFT)
4503: 两个串 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 497 Solved: 226 Description 兔子们在玩两个串的游戏.给 ...
- bzoj 4503 两个串——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 翻转T,就变成卷积.要想想怎么判断. 因为卷积是乘积求和,又想到相等的话相减为0,所以 ...
- bzoj 4503 两个串 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 推式子即可: 不知怎的调了那么久,应该是很清晰的. 代码如下: #include< ...
- bzoj 4503 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...
- BZOJ.4503.两个串(FFT/bitset)
题目链接 \(Description\) 给定两个字符串S和T,求T在S中出现了几次,以及分别在哪些位置出现.T中可能有'?'字符,这个字符可以匹配任何字符. \(|S|,|T|\leq 10^5\) ...
- 【刷题】BZOJ 4503 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹配任何字符. I ...
- bzoj 4503 两个串 快速傅里叶变换FFT
题目大意: 给定两个\((length \leq 10^5)\)的字符串,问第二个串在第一个串中出现了多少次.并且第二个串中含有单字符通配符. 题解: 首先我们从kmp的角度去考虑 这道题从字符串数据 ...
随机推荐
- metasploit中meterpreter命令
meterpreter是Metasploit框架中的一个杀手锏,通常作为漏洞溢出后的攻击载荷所使用,攻击载荷在触发漏洞后能够返回给我们一个控制通道. 常见的meterpreter命令 run scri ...
- Mac改键软件Karabiner使用教程
Mac改键软件Karabiner使用教程 目前Mac上比较好用的改键软件是Karabiner,不过对于最新的Sierra系统,Karabiner失效了.这里介绍的实际上是Karabiner-Eleme ...
- Redis 主从模式
系统:Centos6.6x64安装目录:/usr/local/主:192.168.100.103从:192.168.100.104 ,下载安装: 安装依赖: # yum install gcc tcl ...
- Linux之目录结构解析
/ /bin 存放[二进制可执行命令]目录,与usr/bin相比,它是系统性的.主要放置一些系统的必备执行档.例如:cat.cp.chmod df.dmesg.gzip.kill.ls. mkd ...
- Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- B - Fuzzy Search (FFT)
题目链接:https://cn.vjudge.net/contest/281959#problem/B 题目大意:给你n,m,k.然后输入两个字符串,n代表第一个字符串s1,m代表第二个字符串s2,然 ...
- drozer工具的安装与使用:之一安装篇
本教程针对于Windows平台下drozer的安装与使用 使用该工具需要JDK的支持,所以使用此工具之前请自行安装 JDK(如有问题的请自行百度其他教程,这里就不赘述了) 还需要安卓调试工具a ...
- Android如何降低service被杀死概率
http://www.jianshu.com/p/06a1a434e057 http://www.cnblogs.com/ylligang/articles/2665181.html Android应 ...
- C#的五种访问修饰符
简述: 所有类型和类型成员都具有可访问性级别,用来控制是否可以在您程序集的其他代码中或其他程序集中使用它们. 可使用访问修饰符指定声明类型或成员的可访问性. 在C#语言中,共有五种访问修饰符:publ ...
- python3爬虫一
1.环境安装: 在py3env(虚拟环境)下安装scrapy,新建项目: pip install scrapy scrapy startproject ArticleSpider cd Article ...