1. 程式人生 > >BZOJ4259:殘缺的字串(FFT+卡常)

BZOJ4259:殘缺的字串(FFT+卡常)

題面
題意:兩個串A和B,有萬用字元,問A在B中出現了幾次。

好題(除了卡常以外)
將萬用字元設為0
列舉開頭x
f[x]=i=0m1A[i]B[x+i](A[i]B[x+i])2

若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]−

[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 344Reverse String 反轉字串python、java

Leetcode 344:Reverse String 反轉字串 公眾號:愛寫bug Write a function that

POJ 2367Genealogical 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

Day50CSS屬性float、position

定位 alt 變化 white 覆蓋問題 ecc wid 寬度 epp 一、float屬性 1、基本屬性 先來了解一下block元素和inline元素在文檔流中的排列方式。   block元素通常被現實為獨立的一塊,獨占一行,多個block元素會各自新起一行,默認block

Entity Framework使用特性數據註解創建表結構

int32 概念 ann 應該 etime max 繼承 兩個 width 一、理解Code First及其約定和配置   傳統設計應用的方式都是由下而上的,即我們習慣優先考慮數據庫,然後使用這個以數據為中心的方法在數據之上構建應用程序。這種方法非常適合於數據密集的應用或者

重構改善既有代碼設計--重構手法01Extract 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)必須自行