求母串中的子串行 (預處理 狀態機)

2021-08-21 23:31:45 字數 1497 閱讀 4695

小z玩膩了迷宮遊戲,於是他找到了easy,準備和easy玩這麼乙個遊戲

小z準備了乙個字串s (s的長度不超過10000)

又準備了m個小的字串(m最大不超過1000000,每個小字串的長度不超過10)

現在小z想請教easy老師,m個小字串中有多少個小字串是大字串s的子串行?

如果easy老師答不上來就要請客,現在easy老師很苦惱,你能幫幫他嗎?

子串行可以理解為不要求連續的子串,若還是不了解請看下面的鏈結中,最佳答案的回答

只有一組測試資料

第一行是大字串s(s的長度不超過10000)

第二行是乙個整數m,表示小字串的個數(m最大不超過1000000)

接下來m行每行給出乙個小字串(長度不超過10)

保證沒有空字串

輸出只有乙個整數,代表m個小字串中是大字串s的子串行的個數

amrocegijgyvkgarnffb4i

jsjqg

ac

2

樣例解釋:

對於4個小字串

1 i因為大字串s裡有i,所以i肯定是大字串,答案+1

2 jsj

大字串s中沒有任何乙個子串行是jsj

3 qg

大字串s中沒有任何乙個子串行是qg 

4 ac

大字串s中的第1個字元'a'和第5個字元'c'構成的子串行

正好是ac,答案+1 

4個小字串中有2個字串是大字串s的子串行

所以答案為 2

思路:可以預處理出乙個狀態機來,next1[i]['c'] 為母串中i位置之後的c字元出現的位置,這樣輸入字串之後可以直接在next1陣列中跑一邊找一下看是否能夠跑完字串;

例如 abcdeabcd

next[0]['a'] = 5(即0位置之後的第乙個a字元出現在第五個位置);

next[0]['b'] = 6;

……(26個字母都找一邊沒有的話就是 -1(初值));

next[1][a] = 4(即1位置之後第乙個a字元出現在的第4個位置);

……(整個母串的每個位置都找一邊26個字母)

之後再用乙個陣列標記一下 26個字母第一次出現在母串中的位置;

** :

#include

#include

#include

#include

using namespace std;

int next1[10005][10005];

int d[10005];

int main()}}

}for(int i = 0; i < 26; i++)}}

cin >> n;

string s2;

int ans = 0;

while(n--)

}if(l >= s2.size()) ans++;

}printf("%d\n",ans);

}

求字串中的最長不重複子串

題目描述 給定一字串只包含數字,請寫乙個演算法,找出該字串中的最長不重複子串 不重複是指子串中每一元素不同於子串中其他元素 如 120135435 最長不重複子串為 201354 實現如下 時間複雜度o n 空間複雜度o m class solution void maxnonrepetitives...

求兩個字串的最長公共子串行

autor baker time 25 5 06 求兩個字串的最長公共子串行。x的乙個子串行是相應於x下標序列的乙個子串行,求解兩個序列的所有子串行中長度最大的,例如輸入 pear,peach輸出 pea。分析 次題可用動態規劃演算法解決。首先定義乙個二維陣列 a a i j m g ddgg dd...

求兩個字串的最長公共子串行

方法 一 遞迴 採用遞迴的方法,簡單,但是速度比較慢,當字串比較大的時間,多次遞迴會計算一些重複的過程,因此速度很很慢。include using namespace std int lcslength int i,int j string x,y int lenx,leny int main re...