題意:給定n(n≤50)個模式串(每個模式串長度不超過50)和1個目標串(長度不超過1000000),問目標串中包含多少個模式串。
思路:用模式串建立dfa,然後用目標串掃一遍即可。使用陣列建立dfa,模板參考(陣列開500000乙隻tle,減小到250000才能ac(但是鏈結中的陣列開的就是500000呀。。。)
#include #include #include #include #include #include using namespace std;
#define n 250010
char s[1000005];
queueq;
int t[n][26],fail[n],num[n];
int t,n,m,top,res;
void init()
void insert(char* s)
num[r] ++;
}void builddfa()}}
}void search(char* s)
}}int main(){
scanf("%d",&t);
while(t--){
int i;
init();
scanf("%d",&n);
for(i = 0;i
怎樣理解KMP演算法中模式串後移的目標位置?
到這裡大家對kmp應該有所了解,這裡就不對kmp的相關概念進行介紹了。kmp有個很基本的思想,就是當主串和模式串出現不匹配,需要進行下次匹配前,我們移動的是模式串,而非主串。例如 串 abdabc 和串 abc 注 計算機中模式串是不會移動的,所以這裡所說的 移動 也就是其下標 j 指向的變化 插播...
hdu 2087 剪花布條 求模式串在主串中的個數
problem description 一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?input 輸入中含有一些資料,分別是成對出現的花布條和小飾條,其布條都是用可見ascii字元表示的,可見的ascii...
KMP模式匹配中匹配的總子串數
類似題目 include include intnext 10001 int len1,len2,total char str 10001 buf 1000001 void get next else j next j 為何遞迴字首索引j next j 就能找到長度更短的相同字首字尾呢?這又歸根到 ...