小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的子串行的個數
amrocegijgyvkgarnffb4ijsjqg
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...