t組資料,每組資料輸入兩個字串s,c;求s在c**現多少次,輸出次數。
這道題是個字串匹配題,可以用kmp演算法來做,也可用字串hash。這兩個演算法的時間複雜度都是線性的。下邊分別介紹兩種演算法。
字串hash
在c語言裡每個字元都可以看成乙個數字,範圍是0-127,比如『a』=97; 所以乙個字串可以看成乙個128進製的數字,即這個字串的hash值。
比如字串abc可以看成128進製的數字 97 98 99 ,等於97*128^2+98^1+99。
字串hash函式把乙個任意長度的字串對映成乙個非負整數,其衝突概率幾乎為0.
可以在o(strlen(s))的時間內算出字串s的hash值。
可以在o(strlen(c))的時間內算出c[1到i](1<=i<=strlen(c))的hash值,儲存在陣列裡。
然後遍歷一遍hash值,算長度為strlen(s)的子串有多少hash值與s的hash值相同
**
#include#include #include#include using namespace std;
typedef unsigned long long ull;
const int maxn=1e6+10;
char c[maxn],s[maxn];
ull ha[maxn];
int main()
ha[0]=0;
for(int i=1;i<=n;i++)
int ans=0;
for(int i=m;i<=n;i++)
}cout<kmp
#include#include #include#include using namespace std;
typedef long long ll;
const int maxn=1e6+10;
char c[maxn],s[maxn];
int n,m;
int nxt[maxn];
void f()else
if(j==m)
}cout<}
return 0;
}
POJ 3461題解(kmp演算法)文字串和子串匹配
poj3461傳送門 特殊的樣例 azaazazaza 輸出 所以next陣列要多一位,0 1 1 2 當模式串比較完之後要指向的是next陣列的最後一位,即開始從第二位字母比較,模擬過程如下 azazaza azazaza aza aza 所以這道題和最基礎的文字串和模式串比較不太一樣,是文字串和...
POJ 3080 字串匹配
題意 給出n個字串,找出其最長公共子串,若子串長度 3,則輸出最長公共子串,否則輸出.本來以為要用到kmp或者字尾陣列什麼的,思考了很久沒有思路,看了一下discuss,發現可以暴力過,而且0ms,也是醉了.include include include include include includ...
33 字串匹配演算法
題目 給乙個很長字串,要求找到符合要求的字串,例如目的串123,1 3 2,12 3這些都要找出來 解 這題的意思是,例如給定目的串s abc 那麼在這個很長的字串中尋找子字串,這個子字串中滿足s中的每個字元都要出現,並且s中的某乙個字元只出現1次。設待匹配字串長度位n,模式字串長度位m 1。對待匹...