BZOJ 4259 残缺的字符串
思路
同样是FFT进行字符串匹配
只不过两个都有通配符
匹配函数再乘一个\(A_i\)即可
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int MAXN = 1200000;
const int MOD = 998244353;
const int G = 3;
const int invG = 332748118;
int rev[MAXN];
void cal_rev(int n,int lim){
for(int i=0;i<n;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(lim-1));
}
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(1LL*ans*a)%MOD;
a=(1LL*a*a)%MOD;
b>>=1;
}
return ans;
}
void NTT(int *a,int opt,int n,int lim){
for(int i=0;i<n;i++)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int i=2;i<=n;i<<=1){
int len=i/2,tmp=pow((opt)?G:invG,(MOD-1)/i);
for(int j=0;j<n;j+=i){
int arr=1;
for(int k=j;k<j+len;k++){
int t=(1LL*a[k+len]*arr)%MOD;
a[k+len]=(a[k]-t+MOD)%MOD;
a[k]=(a[k]+t)%MOD;
arr=(1LL*arr*tmp)%MOD;
}
}
}
if(!opt){
int invN = pow(n,MOD-2);
for(int i=0;i<n;i++)
a[i]=(1LL*a[i]*invN)%MOD;
}
}
int n,m,s[MAXN],t[MAXN],a[MAXN],b[MAXN],c[MAXN],ans[MAXN],cnt;
char S[MAXN];
signed main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
scanf("%lld %lld",&m,&n);
scanf("%s",S);
for(int i=0;i<m;i++)
t[i]=(S[i]=='*')?0:S[i]-'a'+1;
reverse(t,t+m);
scanf("%s",S);
for(int i=0;i<n;i++)
s[i]=(S[i]=='*')?0:S[i]-'a'+1;
int midlen=1,midlim=0;
while(midlen<(n+m))
midlen<<=1,midlim++;
cal_rev(midlen,midlim);
for(int i=0;i<midlen;i++)
a[i]=(s[i]*s[i]*s[i])%MOD,b[i]=t[i];
NTT(a,1,midlen,midlim);
NTT(b,1,midlen,midlim);
for(int i=0;i<midlen;i++)
c[i]=(a[i]*b[i])%MOD;
for(int i=0;i<midlen;i++)
a[i]=(2*s[i]*s[i])%MOD,b[i]=(t[i]*t[i])%MOD;
NTT(a,1,midlen,midlim);
NTT(b,1,midlen,midlim);
for(int i=0;i<midlen;i++)
c[i]=(c[i]-a[i]*b[i]+MOD)%MOD;
for(int i=0;i<midlen;i++)
a[i]=s[i],b[i]=(t[i]*t[i]*t[i])%MOD;
NTT(a,1,midlen,midlim);
NTT(b,1,midlen,midlim);
for(int i=0;i<midlen;i++)
c[i]=(c[i]+a[i]*b[i])%MOD;
NTT(c,0,midlen,midlim);
// for(int i=0;i<midlen;i++)
// printf("!%lld\n",c[i]);
for(int i=m-1;i<n;i++)
if(!c[i])
ans[++cnt]=i-m+1;
printf("%lld\n",cnt);
for(int i=1;i<=cnt;i++)
printf("%lld ",ans[i]+1);
return 0;
}
BZOJ 4259 残缺的字符串的更多相关文章
- BZOJ 4259: 残缺的字符串 [FFT]
4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...
- 【刷题】BZOJ 4259 残缺的字符串
Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同 ...
- BZOJ 4259 残缺的字符串(FFT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4259 [题目大意] 给出两个包含*和小写字母的字符串,*为适配符,可以和任何字符匹配, ...
- BZOJ 4259: 残缺的字符串 FFT_多项式
Code: #include<bits/stdc++.h> #define maxn 1200000 using namespace std; void setIO(string s) { ...
- BZOJ 4259 残缺的字符串 ——FFT
[题目分析] 同bzoj4503. 只是精度比较卡,需要试一试才能行O(∩_∩)O 用过long double,也加过0.4.最后发现判断的时候改成0.4就可以了 [代码] #include < ...
- 【BZOJ】4259: 残缺的字符串 FFT
[题意]给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次.字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符.n<=3*10^5. [算 ...
- bzoj 4259 4259: 残缺的字符串【FFT】
和bzoj 4503 https://www.cnblogs.com/lokiii/p/10032311.html 差不多,就是再乘上一个原串字符 有点卡常,先在点值下算最后一起IDFT #inclu ...
- 【BZOJ4259】残缺的字符串
[BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时, ...
- 【BZOJ4259】残缺的字符串(FFT)
[BZOJ4259]残缺的字符串(FFT) 题面 给定两个字符串\(|S|,|T|\),两个字符串中都带有通配符. 回答\(T\)在\(S\)中出现的次数. \(|T|,|S|<=300000\ ...
随机推荐
- 写一个方法,用于解读 url 后面的请求参数,最终得到 {"a":2,"b":3,"c":4};
function getUrlParams(url){ let searchParam = url.split("?")[1]; let searchItemParams = se ...
- python练习题-day17
1.计算n!,例如n=3(计算321=6), 求10! 2.已知一个数列:1.1.2.3.5.8.13.....的规律为从3开始的每一项都等于其前两项的和,这是斐波那契数列.求满足规律的100以内的所 ...
- webpack入门操作教程
1. webpack介绍 在传统的项目中,一个html文件可能会加载多个js.css文件,如果多人协同开发的话,就会出现全局变量被污染.文件直接的依赖问题 而webpack打包工具,会先分析入口文件的 ...
- 【心得】-NO.114.面试.1 -【To HR And Interviewer】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- iOS MJExtension的使用
前言: MJExtension是iOS的字典装模型的一个第三方框架.相对于JSONKit和SBJson相比MJExtension更简单易用.功能更强大. 安装: 使用CocoaPods导入(Cocoa ...
- ELK实时日志分析平台环境部署
为什么要用到ELK一般我们需要进行日志分析场景是:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...
- 北京大学Cousera学习笔记--7-计算导论与C语言基础--基本数据类型&变量&常量
1.整形数据 1.基本型(int 4B).短整型(short 2B).长整型(long 4B) VC环境下 sizeof运算符用于计算某种类型的对象在内存中所占的字节数 ,用法:size(int) ...
- 007-li标签CSS水平居中垂直居中
水平居中是text-align:center垂直居中 一般是用 line-height比如你li的高度是80px 那你设置 line-height:80px 文字就垂直居中
- C# 实现http不同方法的请求
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- 如何在Jenkins上配置一个可以从其它Job取回Artifact的Job
今天因为工作上的需求,需要在Jenskin上配置一个job, 它应该可以从其它所选择的Job中取回Artifact. 首先,在"构建"步骤中添加 "Copy Artifa ...