有限状态自动机字符串匹配c++
时间: 2023-12-22 19:27:55 浏览: 157
以下是使用C++实现有限状态自动机字符串匹配的示例代码:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005; // 最大状态数
const int MAXM = 26; // 字符集大小
int n, m; // n为自动机状态数,m为模式串长度
char P[MAXN]; // 模式串
int fail[MAXN]; // 失配指针
int tr[MAXN][MAXM]; // 状态转移表
void build() { // 构建自动机
memset(tr, 0, sizeof(tr));
memset(fail, 0, sizeof(fail));
n = 0;
for (int i = 0; i < m; i++) {
int c = P[i] - 'a';
int u = 0;
for (int j = i; j < m; j++) {
if (!tr[u][c]) {
tr[u][c] = ++n;
}
u = tr[u][c];
}
}
for (int c = 0; c < MAXM; c++) {
if (tr[0][c]) {
fail[tr[0][c]] = 0;
}
}
for (int u = 1; u <= n; u++) {
for (int c = 0; c < MAXM; c++) {
if (!tr[u][c]) {
tr[u][c] = tr[fail[u]][c];
} else {
fail[tr[u][c]] = tr[fail[u]][c];
}
}
}
}
int match(char* T) { // 在文本串T中匹配模式串P
int cnt = 0;
int u = 0;
for (int i = 0; T[i]; i++) {
int c = T[i] - 'a';
u = tr[u][c];
for (int j = u; j && P[j]; j = fail[j]) {
cnt++;
}
}
return cnt;
}
int main() {
cin >> P;
m = strlen(P);
build();
char T[MAXN];
cin >> T;
cout << match(T) << endl;
return 0;
}
```
阅读全文
相关推荐


















