BZOJ4259:殘缺的字串(FFT+卡常)
題面
題意:兩個串A和B,有萬用字元,問A在B中出現了幾次。
好題(除了卡常以外)
將萬用字元設為0
列舉開頭x
設
若f[x]為0,則A在B[x]處出現了一次
f又恰好為一個卷積的形式
fft優化即可(好像爆int,用不了ntt)
卡卡常就過了
為什麼單位根累乘會比預處理快很多
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef long long LL;
const int p=(479<<21)+1,N=1444444;
const double pi=acos(-1);
struct yy
{
double x,y;
yy(double a=0,double b=0):x(a),y(b){}
};
yy operator +(yy a,yy b){return yy(a.x+b.x,a.y+b.y);}
yy operator -(yy a,yy b){return yy(a.x-b.x,a.y-b.y);}
yy operator *(yy a,yy b){return yy(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
int n,rev[N];
void init(int lim)
{
int k=-1;
n=1;
while(n<=lim)
n<<=1,k++;
for(register int i=0;i<n;i++)
rev[i]=(rev[i>>1]>>1) | ((i&1)<<k);
}
void fft(yy *a,int ops)
{
for(int i=0;i<n;i++)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int m=1,l=2;l<=n;m<<=1,l<<=1)
{
yy wn=yy(cos(pi/m),ops*sin(pi/m));
for(int i=0;i<n;i+=l)
{
yy w=yy(1,0);
for(int k=0;k<m;k++,w=w*wn)
{
yy t=a[i+k+m]*w;
a[i+k+m]=a[i+k]-t;
a[i+k]=a[i+k]+t;
}
}
}
}
int nn,mm;
int a[N],b[N];
yy aa[N],bb[N];
LL ans[N];
int Violet,d[N];
char s[N];
void cheng(int ops)
{
fft(aa,1);
fft(bb,1);
for(int i=0;i<n;i++)
aa[i]=aa[i]*bb[i];
fft(aa,-1);
for(int i=0;i<mm;i++)
ans[i]+=(LL)(aa[i].x/n+0.5)*ops;
}
int main()
{
cin>>nn>>mm;
init(nn+mm-2);
scanf("%s",s);
for(int i=0;i<nn;i++)
a[nn-1-i]=(s[i]=='*') ? 0 : s[i]-'a'+1;
scanf("%s",s);
for(int i=0;i<mm;i++)
b[i]=(s[i]=='*') ? 0 : s[i]-'a'+1;
for(int i=0;i<n;i++)
aa[i]=yy(0,0),bb[i]=yy(0,0);
for(int i=0;i<nn;i++)
aa[i].x=a[i]*a[i]*a[i];
for(int i=0;i<mm;i++)
bb[i].x=b[i];
cheng(1);
for(int i=0;i<n;i++)
aa[i]=yy(0,0),bb[i]=yy(0,0);
for(int i=0;i<nn;i++)
aa[i].x=a[i];
for(int i=0;i<mm;i++)
bb[i].x=b[i]*b[i]*b[i];
cheng(1);
for(int i=0;i<n;i++)
aa[i]=yy(0,0),bb[i]=yy(0,0);
for(int i=0;i<nn;i++)
aa[i].x=a[i]*a[i];
for(int i=0;i<mm;i++)
bb[i].x=b[i]*b[i];
cheng(-2);
for(int i=nn-1;i<=mm-1;i++)
if(!ans[i])
d[++Violet]=i-nn+2;
printf("%d\n",Violet);
for(int i=1;i<=Violet;i++)
printf("%d%c",d[i], (i!=Violet)?' ':'\n');
return 0;
}
相關推薦
BZOJ4259:殘缺的字串(FFT+卡常)
題面 題意:兩個串A和B,有萬用字元,問A在B中出現了幾次。 好題(除了卡常以外) 將萬用字元設為0 列舉開頭x 設f[x]=∑m−1i=0A[i]∗B[x+i]∗(A[i]−B[x+i])2f[x]=∑i=0m−1A[i]∗B[x+i]∗(A[i]−
2018.11.17 bzoj4259: 殘缺的字串(fft)
傳送門 f f t fft
[BZOJ4259]殘缺的字串(FFT)
題目描述 傳送門 題目大意:給出一個模板串和一個母串,問模板串在母串中出現過幾次。帶萬用字元。 題解 這道題和兩個串那道題是差不多的。。 令F(i)表示將模板串的最後一個懟到母串的第i個是否能
【BZOJ4259】殘缺的字串(FFT)
Description Solution 考慮將子串倒過來,對於每個字元,如果是∗∗,那麼值為00,否則為Ai−96Ai−96。 那麼我們設f(i)=∑j(Aj−Bi−j)2AjBi−jf(i)=∑j(Aj−Bi−j)2AjBi−j,如果f(i
BZOJ4836: [Lydsy1704月賽]二元運算【分治FFT】【卡常(沒卡過)】
Description 定義二元運算 opt 滿足 現在給定一個長為 n 的數列 a 和一個長為 m 的數列 b ,接下來有 q 次詢問。每次詢問給定一個數字 c 你需要求出有多少對 (i, j) 使得 a_i opt b_j=c 。 Input 第一行是一個整數 T (1≤T≤10) ,表示測
【bzoj3240 && 洛谷P1397】矩陣遊戲[NOI2013](矩陣乘法+卡常)
queue tle ext 矩陣乘法 gin click -- 常數 dot 題目傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 這道題其實有普通快速冪+費馬小定理的解法…&helli
5037 線段樹練習4加強版 分塊(卡常)
/** 5037 線段樹練習4加強版 連結:http://codevs.cn/problem/5037/ op 1 區間修改 op 2 區間多少個數為k的倍數; 依據資料範圍:可記錄每個塊內每個數字出現的次數 區間加操作,完整塊依舊0(1),非完整塊 直接暴力即
javaSE (四十)網路程式設計(TCP傳輸、伺服器多執行緒、網路程式設計練習:反轉字串、上傳檔案)
1、TCP傳輸: 1.客戶端 建立Socket連結服務端(指定ip地址,埠號),通過ip地址找到對應的伺服器 呼叫Socket的getInputStream和getOutputStream方法獲取和伺服器端相連的IO流 2.伺服器端 建立Se
2018.12.5【WC2017】【LOJ2286】【洛谷P4604】挑戰(卡常)
洛谷傳送門 LOJ傳送門 解析: 目前LOJ速度rank1。但是洛谷上面有兩個40msAC的在我前面(空間還小的出奇,估計連排序的陣列都存不下)。。。估計是面向資料程式設計。。 說明:博主是一個高一OIER,沒有認真學過大學電腦科學課程,如果題解中有任何地方不嚴謹,
【NOIP 校內模擬】T1 優美的序列(二分+st表+卡常)
我是菜雞 我是蒟蒻 我好菜 ak一定是區間最小的值,且是所有數(包括自己)的最大公約數 我沒看出來 沒救了 noip爆零了 回家養豬了 沒學上了 怎麼辦 gcd有單調性 gcd有單調性 gcd有單調性 gcd有單調性 gcd有單調性 可以二分 可以二分 可以二分 可以二分 要說多少遍才記得到 我沒想到 沒救了
Leetcode 344:Reverse String 反轉字串(python、java)
Leetcode 344:Reverse String 反轉字串 公眾號:愛寫bug Write a function that
POJ 2367:Genealogical tree(拓撲排序)
ostream oge lis limit return ember rand output together Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Sub
【學習筆記】String進階:StringBuffer類(線程安全)和StringBuilder類
n) static this util double 字符串 對象 ice 單線程 一、除了使用String類存儲字符串之外,還可以使用StringBuffer類存儲字符串。而且它是比String類更高效的存儲字符串的一種引用數據類型。 優點: 對字符串進行連接操作時,
ufldl學習筆記與編程作業:Linear Regression(線性回歸)
cal bug war 環境 art link 行數 ear sad ufldl學習筆記與編程作業:Linear Regression(線性回歸) ufldl出了新教程,感覺比之前的好。從基礎講起。系統清晰,又有編程實踐。在deep learning高質量群裏
python之路——作業:Select FTP(僅供參考)
view info warn phi socket split list 開始 序號 一、作業需要 使用SELECT或SELECTORS模塊實現並發簡單版FTP允許多用戶並發上傳下載文件 二、README 程序實現了以下功能: 1、用戶登錄註冊(測試用戶:japh
Day50:CSS屬性(float、position)
定位 alt 變化 white 覆蓋問題 ecc wid 寬度 epp 一、float屬性 1、基本屬性 先來了解一下block元素和inline元素在文檔流中的排列方式。 block元素通常被現實為獨立的一塊,獨占一行,多個block元素會各自新起一行,默認block
Entity Framework(三):使用特性(數據註解)創建表結構
int32 概念 ann 應該 etime max 繼承 兩個 width 一、理解Code First及其約定和配置 傳統設計應用的方式都是由下而上的,即我們習慣優先考慮數據庫,然後使用這個以數據為中心的方法在數據之上構建應用程序。這種方法非常適合於數據密集的應用或者
重構改善既有代碼設計--重構手法01:Extract Method (提煉函數)
設置 都是 覆寫 list() 為什麽 新建 細粒度 align 容易 背景: 你有一段代碼可以被組織在一起並獨立出來。將這段代碼放進一個獨立函數,並讓函數名稱解釋該函數的用途。 void PrintOwing(double amount)
R語言:隨機抽樣(sample函數)
.cn png 函數 -1 數據集 img image 如果 一個數 如果想從一堆數據集中隨機抽出一個數,用sample函數就能實現,代碼展示如下: forehead<-c(249,189,128,111,184,233,313,120,151,196,135,
添磚加瓦:設計模式(單例模式)
argv pri 方法 職責 ger 資源管理 存在 優缺點 names 1、單例定義及要素 定義: 保證一個類只有一個實例存在,同時提供能對該實例加以訪問的全局訪問方法(GoF中單例模式的定義)。 要素: (1)某個類只能有一個實例 (2)必須自行