bzoj 4259: 殘缺的字符串

  這題好神啊,居然是fft,表示一直在往數據結構上想。

  把'*'當成0,那么兩個串可以匹配當且僅當$$\sum (a[i]-b[i])^2\times a[i]\times b[i]==0$$

  我們可以把平方拆開,然后就變成了幾個乘積相加的形式,那就大力翻轉一個串然后跑FFT。

  因為最開始MLE了所以復制粘貼了好多東西。

  

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<cmath>
  6 #define N 1200005
  7 #define M 300005
  8 #define pi acos(-1)
  9 #define E complex
 10 using namespace std;
 11 struct complex
 12 {
 13     double x,y;
 14     complex(double _x,double _y){x=_x;y=_y;}
 15     complex(){;}
 16     friend complex operator * (const complex &a,const complex &b)
 17     {
 18         complex c;c.x=a.x*b.x-a.y*b.y;c.y=a.x*b.y+a.y*b.x;return c;
 19     }
 20     friend complex operator / (complex a,double b)
 21     {
 22         return complex(a.x/b,a.y/b);
 23     }
 24     friend complex operator + (complex a,complex b)
 25     {
 26         return complex(a.x+b.x,a.y+b.y);
 27     }
 28     friend complex operator - (complex a,complex b)
 29     {
 30         return complex(a.x-b.x,a.y-b.y);
 31     }
 32 };
 33 int R[N];int n;
 34 void fft(E *a,int f)
 35 {
 36     for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
 37     for(int i=1;i<n;i<<=1)
 38     {
 39         E wn(cos(pi/i),f*sin(pi/i));
 40         for(int j=0;j<n;j+=(i<<1))
 41         {
 42             E w(1,0);
 43             for(int k=0;k<i;k++,w=w*wn)
 44             {
 45                 E x=a[j+k],y=w*a[j+k+i];
 46                 a[j+k]=x+y;a[j+k+i]=x-y;
 47             }
 48         }
 49     }
 50     if(f==-1)for(int i=0;i<n;i++)a[i]=a[i]/n;
 51 }
 52 int nn,mm;
 53 char s1[M],s2[M],s3[M];
 54 E a1[N],b1[N],c1[N];
 55 int ans[N];
 56 int st[M],top;
 57 int main()
 58 {
 59     scanf("%d%d",&nn,&mm);
 60     scanf("%s",s3);scanf("%s",s2);
 61     int l=0;
 62     for(n=1;n<2*mm;n<<=1)l++;
 63     for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(l-1));
 64     for(int i=0;i<nn;i++)s1[i]=s3[nn-i-1];
 65     for(int i=0;i<mm;i++)
 66     {
 67         int tmp=s2[i]-'a'+1;double p=tmp+0.0;
 68         if(s2[i]=='*')p=0;
 69         b1[i].x=p;
 70     }
 71     for(int i=0;i<nn;i++)
 72     {
 73         int tmp=s1[i]-'a'+1;double p=tmp+0.0;
 74         if(s1[i]=='*')p=0;
 75         a1[i].x=p*p*p;
 76     }
 77     fft(a1,1);fft(b1,1);
 78     for(int i=0;i<n;i++)c1[i]=a1[i]*b1[i];
 79     for(int i=0;i<n;i++)a1[i].x=a1[i].y=b1[i].x=b1[i].y=0;
 80     
 81     for(int i=0;i<mm;i++)
 82     {
 83         int tmp=s2[i]-'a'+1;double p=tmp+0.0;
 84         if(s2[i]=='*')p=0;
 85         b1[i].x=p*p;
 86     }
 87     for(int i=0;i<nn;i++)
 88     {
 89         int tmp=s1[i]-'a'+1;double p=tmp+0.0;
 90         if(s1[i]=='*')p=0;
 91         a1[i].x=p*p;
 92     }
 93     fft(a1,1);fft(b1,1);
 94     for(int i=0;i<n;i++)c1[i]=c1[i]-(a1[i]*b1[i]),c1[i]=c1[i]-(a1[i]*b1[i]);
 95     for(int i=0;i<n;i++)a1[i].x=a1[i].y=b1[i].x=b1[i].y=0;
 96 
 97     for(int i=0;i<mm;i++)
 98     {
 99         int tmp=s2[i]-'a'+1;double p=tmp+0.0;
100         if(s2[i]=='*')p=0;
101         b1[i].x=p*p*p;
102     }
103     for(int i=0;i<nn;i++)
104     {
105         int tmp=s1[i]-'a'+1;double p=tmp+0.0;
106         if(s1[i]=='*')p=0;
107         a1[i].x=p;
108     }
109     fft(a1,1);fft(b1,1);
110     for(int i=0;i<n;i++)c1[i]=c1[i]+(a1[i]*b1[i]);
111     
112     fft(c1,-1);
113 
114     for(int i=nn-1;i<mm;i++)
115     {
116         if(fabs(c1[i].x)<0.5)
117         {
118             st[++top]=i-nn+2;
119         }
120     }
121     printf("%d\n",top);
122     for(int i=1;i<=top;i++)
123     {
124         if(i!=top)printf("%d ",st[i]);
125         else printf("%d\n",st[i]);
126     }
127     return 0;
128 }

?

轉載于:https://www.cnblogs.com/ezyzy/p/6511727.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371410.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

錄屏時計算機休眠,硬盤錄像機里硬盤提示休眠,什么意思?

休眠&#xff0c;電腦內存中的數據寫入硬盤&#xff0c;關閉電腦。重新啟動的時候重新將數據加載到內存中&#xff0c;恢復休眠前狀態。睡眠&#xff0c;和休眠一個意思&#xff0c;98系統下叫睡眠。xp系統叫休眠。98系統睡眠時&#xff0c;內存數據寫入虛擬內存&#xff0c;xp…

MySQL數據庫的基本操作

-- 連接mysql 數據庫(前提是配置好MySQL數據庫的環境變量&#xff0c;加入path)mysql -uroot -p -- 設置文本的輸入輸出編碼&#xff1a;cmd 使用的是gbk&#xff0c;不然顯示亂碼set names gbk; -- 創建數據庫create database mydatabase charset utf8; -- 創建用戶 user001cr…

使用NoSQL實施實體服務–第5部分:使用云提高自治性

在先前的文章中&#xff0c;我討論了如何通過結合使用Java Web Services &#xff0c; Java EE和CouchDB NoSQL數據庫為產品構建SOA“實體”服務。 在本系列的最后一篇文章中&#xff0c;我將利用我已經創建的一些技術資產&#xff0c;并使用一些流行的SOA模式實現一些新的用戶…

樂高計算機發展史教程,【樂高產品發展史特別篇】樂高恐龍發展史

—— 寫在前面 ——2018年6月22日&#xff0c;《侏羅紀世界2&#xff1a;失落王國》全球上映&#xff1b;4月16日&#xff0c;樂高同名系列套裝全球發售。恐龍是一個伴隨了樂高產品二十余年的主題&#xff0c;其實在一年以前就有這樣一個計劃完成樂高恐龍發展史的相關內容&…

mvc 連接數據庫但單復值得問題

1. The model backing the ‘MusicStoreDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database Movie這個表是用來記錄Model的版本號的&#xff0c;你每次重新生成一次數據庫它就會重新給ModelHash…

Mybatis處理表關聯(懶加載)

1.關系型數據庫&#xff1f; 數據庫中的表對象之間是有關系的。 一對一&#xff0c;一對多&#xff0c;多對多。 ORM映射。數據庫表映射到實體對象。 實體與實體之間是有關系的。 一對多的關系。 比如商品分類表與商品表之間的關系&#xff0c;就是一對多的關系。 入庫主表與入…

Spring–設計領域模型和服務層

我們將為時間表管理構建應用程序。 因此&#xff0c;讓我們首先考慮一些用例和實體。 讓我用幾個項目符號寫它們&#xff1a; 任務由經理分配給員工。 一項任務可以分配給許多員工。 員工將他在某些任務上工作的小時數填滿至系統。 經理/員工查看時間表上的報告&#xff08;時…

如何把很多照片拼成一張照片_一張現場照片引發的中韓之爭

來源&#xff1a;渤海新水手聊船專欄前幾天&#xff0c;微信群里(造船質量技術高級交流群)一位網友發了一張韓國船廠的現場照片&#xff0c;沒想到瞬間引發全群幾十位網友的熱烈討論&#xff0c;中韓之爭就此上演&#xff01;照片反映出的是國內船廠很難做到的部分——分段預裝…

計算機文檔設置,電腦這樣設置快速的共享文件、分享文檔!

原標題&#xff1a;電腦這樣設置快速的共享文件、分享文檔&#xff01;在日常辦公的時候&#xff0c;有時需要共同使用一些文件或者文檔或者一些視頻資料。那么要怎么方便的使用這些共同的資源呢&#xff1f;當然這時大家可能會說可以用QQ、微信傳給對方不就可以了。但是如果文…

關于vue 框架與后臺框架的混合使用的嘗試

這幾天我在研究前臺框架和后臺框架融合的問題,進行了一些嘗試; 我前臺選擇的是 vue,當然也可以選擇 react 等其他 mvvm 框架,不過 vue 對于我來說是最熟悉的; 后臺話,我選擇的是 php 的 lumen 框架,他是laravel 的簡化版,因為比較輕量,所以這也是我的選擇; 先說下我這邊的環境:…

GitHub上整理的一些工具

GitHub上整理的一些工具 GitHub 2015-11-19 10:10:47 發布您的評價: 0.0 收藏 5收藏技術站點 Hacker News&#xff1a;非常棒的針對編程的鏈接聚合網站Programming reddit&#xff1a;同上MSDN&#xff1a;微軟相關的官方技術集中地&#xff0c;主要是文檔類infoq&#x…

服務器 raid 1t硬盤嗎,用了4塊1T的硬盤,做了raid5,顯示有2.7T,但是分區做完系統后,有700多G不能動...

滿意答案ouourpt892013.11.14采納率&#xff1a;46% 等級&#xff1a;12已幫助&#xff1a;13583人出現這種情況是由于創建的硬盤使用的是基本磁盤(MBR)格式&#xff0c;因受MBR磁盤格式技術的限制&#xff0c;MBR磁盤只支持2TB的磁盤容量&#xff0c;所以出現了你所說的情況…

如何編寫更好的POJO服務

在Java中&#xff0c;您可以輕松地在Plain Old Java Object&#xff08;POJO&#xff09;類中實現一些業務邏輯&#xff0c;并且可以在高級服務器或框架中輕松運行它們。 有許多服務器/框架&#xff0c;例如JBossAS&#xff0c;Spring或Camel等&#xff0c;它們使您可以部署POJ…

mongo 唯一約束索引_快速掌握mongoDB(三)——mongoDB的索引詳解

1 mongoDB索引的管理本節介紹mongoDB中的索引&#xff0c;熟悉mysql/sqlserver等關系型數據庫的小伙伴應該都知道索引對優化數據查詢的重要性。我們先簡單了解一下索引&#xff1a;索引的本質就是一個排序的列表&#xff0c;在這個列表中存儲著索引的值和包含這個值的數據(數據…

HBase MapReduce

1. HBase to HBase Mapper 繼承 TableMapper&#xff0c;輸入為Rowkey和Result. public abstract class TableMapper<KEYOUT, VALUEOUT> extends Mapper<ImmutableBytesWritable, Result, KEYOUT, VALUEOUT> { public TableMapper() { }} package com.scb.ja…

第六期的知識點

1.volatile詳解 在應用程序中&#xff0c;volatile主要是被設計用來修飾被不同線程訪問和修改的變量 .volatile的本意是“易變的” 因為訪問寄存器要比訪問內存單元快的多,所以編譯器一般都會作減少存取內存的優化&#xff0c;但有可能會讀臟數據。當要求使用volatile聲明變量值…

在DelayQueue中更改延遲,從而更改順序

因此&#xff0c;我正在研究構建一個簡單的對象緩存&#xff0c;該緩存在給定時間后會使對象過期。 顯而易見的機制是使用Java并發包中的DelayedQueue類。 但我想知道是否有可能在將對象添加到隊列后更新延遲。 看一下Delayed接口&#xff0c;似乎沒有充分的理由不在文檔中&…

vi編輯器服務器維護,vi編輯器有哪幾種工作模式及如何轉換_網站服務器運行維護,vi編輯器,工作模式...

整理分享一些 Linux思維導圖(值得收藏)_網站服務器運行維護本篇文章整理分享了一些 Linux思維導圖(值得收藏)。有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對大家有所幫助。vi編輯器有三種基本的工作模式&#xff0c;分別是&#xff1a;指令行模式、…

(八)cmockery中的calculator和run_tests函數的注釋代碼

所分析的calculator.c和calculator_test.c文件位于 工程中的 cmockery/src/example/ 目錄下&#xff0c;是一個相對而言比較全面的樣例程序&#xff0c;用到了cmockery項目中的大多數單元測試方法。基本上涵蓋了之前所有的樣例程序中的用法&#xff0c;還有兩組測試是database操…

家用雙wan口路由器推薦_請推薦雙WAN口的有線千兆硬路由器?

利益相關&#xff1a;TP-LINK一線銷售人員(來看看會不會有推薦我司產品的2333 )路由器&#xff1a;TL-ER3220G&#xff0c;帶機量300終端&#xff0c;可管理50個AP&#xff0c;最大支持四條寬帶接入POE交換機&#xff1a;TL-SF1005P(5口百兆) TL-SG1005P(5口千兆) TL-SF1009PH(…