1. 程式人生 > 其它 >algorithm標頭檔案常用函式

algorithm標頭檔案常用函式

技術標籤:PAT

詳細參考

在這裡插入圖片描述這個是用來加快cin和cout的

例項

給定一個模式串S,以及一個模板串P,所有字串中只包含大小寫英文字母以及阿拉伯數字。

模板串P在模式串S中多次作為子串出現。

求出模板串P在模式串S中所有出現的位置的起始下標。

輸入格式

第一行輸入整數N,表示字串P的長度。

第二行輸入字串P。

第三行輸入整數M,表示字串S的長度。

第四行輸入字串S。

輸出格式

共一行,輸出所有出現位置的起始下標(下標從0開始計數),整數之間用空格隔開。

資料範圍

1≤N≤105
1≤M≤106

輸入樣例:

3
aba
5
ababa

輸出樣例:

0 2

#include<iostream>
using namespace std; const int N = 100010,M = 1000010; char a[N],b[M]; int ne[N]; //next陣列 int n,m; //下標從1開始儲存 void cal_next(char str[],int len) { ne[0] = 0; ne[1] = 0; for(int i=2;i<=len;i++) { int j = ne[i-1]; //j代表已經匹配的長度 if(j!=0){ while(j!=0) { if
(str[j+1]==str[i]) { ne[i] = j+1; break; } else{ j = ne[j]; } } } if(j==0){ if(str[i]==str[1]) ne[i] = 1; else ne[i] = 0; }
} } int main() { cin >> n >> a+1 >> m >> b+1; cal_next(a,n); //str2是模板串 //兩個串的下標都是從1開始的 //j代表模式串已經匹配成功的字元個數 //現在開始匹配模板串的第i號是否匹配 // kmp演算法實現 for(int i=1,j=0;i<=m;i++) { while(j!=0 && b[i] != a[j+1]) j = ne[j]; if(b[i]==a[j+1]) j++; if(j==n) { printf("%d ",i-n); j = ne[j]; } } return 0; }