bzoj4403 两个串
Description
Input
Output
两个串a,b相等(b中有通配符)当且仅当Σ(a[i]-b[i])2b[i]=0,其中a[i],b[i]为对应字符的对应编号,且通配符对应0
翻转S串并把T串用0补至与S等长后上式可化为卷积形式用fft计算
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
int N,P;
const double pi=3.14159265358979323846;
int r[];
struct cplx{
double a,b;
inline cplx(double r=,double i=){a=r;b=i;}
inline cplx operator+(cplx x){return cplx(a+x.a,b+x.b);}
inline cplx operator-(cplx x){return cplx(a-x.a,b-x.b);}
inline cplx operator*(cplx x){return cplx(a*x.a-b*x.b,a*x.b+b*x.a);}
}a[],b[];
void dft(cplx*a,int t){
for(int i=;i<N;i++)if(i>r[i])std::swap(a[i],a[r[i]]);
for(int i=;i<N;i<<=){
cplx w(cos(pi/i),t*sin(pi/i));
for(int j=;j<N;j+=i<<){
cplx e(),*b=a+j,*c=b+i;
for(int k=;k<i;k++,e=e*w){
cplx x=b[k],y=c[k]*e;
b[k]=x+y,c[k]=x-y;
}
}
}
}
char s1[],s2[];
int v1[],v2[];
int h1[],h2[];
int as[],ap=;
int l1,l2,h3=;
int main(){
input:{
scanf("%s%s",s1,s2);
l1=strlen(s1)-;
l2=strlen(s2)-;
for(int i=;i<=l1;i++)v1[i]=s1[l1-i]-'a'+;
for(int i=;i<=l2;i++)v2[i]=s2[i]!='?'?s2[i]-'a'+:;
for(int i=;i<=l2;i++)h3+=v2[i]*v2[i]*v2[i];
}
init:{
for(N=,P=;N<=l1+;N<<=,++P);
N<<=,++P;
for(int i=;i<N;i++)r[i]=r[i>>]>>|(i&)<<P;
}
calc:{
for(int i=;i<=l1;i++)a[i]=cplx(v1[i]*v1[i]);
for(int i=;i<=l1;i++)b[i]=cplx(v2[i]);
for(int i=l1+;i<N;i++)a[i]=b[i]=cplx();
dft(a,),dft(b,);
for(int i=;i<N;i++)a[i]=a[i]*b[i];
dft(a,-);
for(int i=;i<=l1;i++)h1[i]=(int)(a[i].a/N+0.5); for(int i=;i<=l1;i++)a[i]=cplx(v1[i]);
for(int i=;i<=l1;i++)b[i]=cplx(v2[i]*v2[i]);
for(int i=l1+;i<N;i++)a[i]=b[i]=cplx(,);
dft(a,),dft(b,);
for(int i=;i<N;i++)a[i]=a[i]*b[i];
dft(a,-);
for(int i=;i<=l1;i++)h2[i]=(int)(a[i].a/N+0.5);
}
output:{
for(int i=l1;i>=l2;i--)if(h1[i]-*h2[i]+h3==)as[ap++]=l1-i;
printf("%d\n",ap);
for(int i=;i<ap;i++)printf("%d\n",as[i]);
}
return ;
}
bzoj4403 两个串的更多相关文章
- bzoj 4503 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...
- BZOJ4503: 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...
- SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)
题目大意: 给出两个长度小于等于25W的字符串,求它们的最长公共子串. 题目链接:http://www.spoj.com/problems/LCS/ 算法讨论: 二分+哈希, 后缀数组, 后缀自动机. ...
- BZOJ 4503: 两个串 [FFT]
4503: 两个串 题意:兔子们在玩两个串的游戏.给定两个只含小写字母的字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹 ...
- 【BZOJ4503】两个串(FFT)
[BZOJ4503]两个串(FFT) 题面 给定串\(S\),以及带通配符的串\(T\),询问\(T\)在\(S\)中出现了几次.并且输出对应的位置. \(|S|,|T|<=10^5\),字符集 ...
- bzoj4503: 两个串 bitset
目录 题目链接 题解 代码 题目链接 bzoj4503: 两个串 题解 暴一发bitset f[i][j] 表示 S[1..i] 是否有个后缀能匹配 T[1..j] 那么假设 S[i+1] 能匹配 T ...
- URAL 1517 Freedom of Choice (后缀数组 输出两个串最长公共子串)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/whyorwhnt/article/details/34075603 题意:给出两个串的长度(一样长) ...
- 【BZOJ 4503】4503: 两个串 (FFT)
4503: 两个串 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 497 Solved: 226 Description 兔子们在玩两个串的游戏.给 ...
- SPOJ 1811 Longest Common Substring(求两个串的最长公共子串 || 或者n个串)
http://www.spoj.com/problems/LCS/ 题目:求两个串的最长公共子串 参考:https://www.cnblogs.com/autoint/p/10345276.html: ...
随机推荐
- spring boot2 基于百度云apiface实现人脸检测与认证1
原理介绍: 基于百度云的人脸资料库(用户上传),调用本地摄像头抓拍的图像,与百度云的用户图像做比对,实现人脸认证. 主要步骤如下: 1. 创建百度去账号 2. 在百度云控制台中创建人脸识别的应用,并记 ...
- Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] E. Weakness and Poorness 三分
E. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Github Clone to local files
cd to you local files address key the word: git clone -0 github https://github.com/xxxxxxxxx Done... ...
- 读写 Excel 工作表
导入诸如 CSV 之类文本格式的数据的优点是不需要依靠某些特定软件来读取数据,并且文件具有可读性,即软件中性.然而,它的缺点也很明显——我们不能直接对文本编辑器中的数据执行计算操作,因为这些内容是纯文 ...
- oracle RAC的客户端HA配置
在ORACLE 9i RAC 环境下,为了做到高可用性,需要对客户端的tnsnames.ora这个文件进行配置,在oracle中这样的配置叫做TAF,这个配置不能使用NETCA配置程序生成.其中ORA ...
- 依据分辨率区分手机、平板、pc
/*手机*/ @media screen and (max-width:600px){ #header,#content,#footer{width:400px;} .right,.center{ma ...
- BooStrap4文档摘录 2 Content, Component
Content Reboot:从新写了主要元素的排列. 本章讲了各种元素及其相关的类. ⚠️ 文档左上角有搜索栏. Components Alert✅ Badge✅ Button✅和Button gr ...
- Rails 5 Test Prescriptions 第10章 Testing for Security
Web 安全是一个可怕的主题.所有的你的程序都依靠密码学,代码超出了你的控制. 尽管如此,你还是可以控制部分网页安全 --所有的logins和access checks和injection error ...
- ubuntu16.04 NVIDIA CUDA8.0 以及cuDNN安装
下载CUDA 官网下载按照自己的实际情况进行选择,下载合适的版本. 官方安装指南 注意这里下载的是cuda8.0的runfile(local)文件. 安装CUDA 下载完成后,解压到当前目录,切换到该 ...
- 硬盘安装CentOS 6.0(超级详细图文教程)
硬盘安装CentOS 6.0(超级详细图文教程) 来源: 引言: 电脑系统是Windows XP,电脑没有光驱.手头没有U盘.没有移动硬盘.电脑主板不支持U盘启动,在这种情况下想安装CentOS ...