2 条题解

  • 0
    @ 2024-4-9 20:36:54

    无 nxt 数组版本:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5 + 5;
    struct Node {
    	int fail, son[26];
    	bool flag, vis;
    } tr[maxn*10];
    int idx;
    // 字典树插入
    void ins(char s[]) {
    	int u = 0;
    	for (int i = 0; s[i]; i++) {
    		int x = s[i] - 'a'; // 0<=x<=25
    		int &v = tr[u].son[x];
    		if (!v) v = ++idx;
    		u = v; 
    	}
    	tr[u].flag = true;
    }
    char s[maxn], t[101];
    int q, ans;
    // 构造失败指针和nxt数组 
    void build() {
    	queue<int> que;
    	for (int i = 0; i < 26; i++)
    		if (tr[0].son[i])
    			que.push(tr[0].son[i]);
    	while (!que.empty()) {
    		int u = que.front(), fail = tr[u].fail; // son[u][i] -- tr[u].son[i]
    		que.pop();
    		for (int i = 0; i < 26; i++) {
    			int &v = tr[u].son[i];
    			if (v) {
    				tr[v].fail = tr[fail].son[i];
    				que.push(v);
    			}
    			else {
    				v = tr[fail].son[i];
    			}
    		}
    	}
    }
    int main() {
    	scanf("%s%d", s, &q);
    	while (q--) {
    		scanf("%s", t);
    		ins(t);
    	}
    	build();
    	for (int u = 0, i = 0; s[i]; i++) {
    		int x = s[i] - 'a';
    //		if (tr[u].son[x])
    //			u = tr[u].son[x];
    //		else
    //			u = nxt[u][x];
    		u = tr[u].son[x];
    		for (int v = u; v && !tr[v].vis; v = tr[v].fail) {
    			tr[v].vis = true;
    			if (tr[v].flag)
    				ans++;
    		}
    	}
    	printf("%d\n", ans);
    	return 0;
    }
    
    • 0
      @ 2024-4-9 20:10:14

      nxt数组版本:

      #include <bits/stdc++.h>
      using namespace std;
      const int maxn = 1e5 + 5;
      struct Node {
      	int fail, son[26];
      	bool flag, vis;
      } tr[maxn*10];
      int idx, nxt[maxn*10][26];
      // 字典树插入
      void ins(char s[]) {
      	int u = 0;
      	for (int i = 0; s[i]; i++) {
      		int x = s[i] - 'a'; // 0<=x<=25
      		int &v = tr[u].son[x];
      		if (!v) v = ++idx;
      		u = v; 
      	}
      	tr[u].flag = true;
      }
      char s[maxn], t[101];
      int q, ans;
      // 构造失败指针和nxt数组 
      void build() {
      	queue<int> que;
      	for (int i = 0; i < 26; i++)
      		if (tr[0].son[i])
      			que.push(tr[0].son[i]);
      	while (!que.empty()) {
      		int u = que.front(), fail = tr[u].fail;
      		que.pop();
      		for (int i = 0; i < 26; i++) {
      			if (tr[fail].son[i])
      				nxt[u][i] = tr[fail].son[i];
      			else
      				nxt[u][i] = nxt[fail][i];
      			int v = tr[u].son[i];
      			if (v) {
      				tr[v].fail = nxt[u][i];
      				que.push(v);
      			}
      		}
      	}
      }
      int main() {
      	scanf("%s%d", s, &q);
      	while (q--) {
      		scanf("%s", t);
      		ins(t);
      	}
      	build();
      	for (int u = 0, i = 0; s[i]; i++) {
      		int x = s[i] - 'a';
      		if (tr[u].son[x])
      			u = tr[u].son[x];
      		else
      			u = nxt[u][x];
      		for (int v = u; v && !tr[v].vis; v = tr[v].fail) {
      			tr[v].vis = true;
      			if (tr[v].flag)
      				ans++;
      		}
      	}
      	printf("%d\n", ans);
      	return 0;
      }
      
      
      
      • 1

      信息

      ID
      81
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      递交数
      17
      已通过
      2
      上传者