求给出的模式串中有多少个在文本串中出现过
//trie的指针int idx;struct node {int fail; //失配指针int ed; //有多少单词以这个节点结尾int pos[30];//子节点的位置}ac[N];//建trie树,向trie树中插入字符串svoid build(string s) {int len = s.size();int cur = 0;for (int i = 0; i < len; i++) {//若trie树中没有该节点,则构造出该节点if (!ac[cur].pos[s[i]-'a'])ac[cur].pos[s[i]-'a'] = ++idx;//继续向下构造cur = ac[cur].pos[s[i]-'a'];}//标记单词结尾ac[cur].ed++;}void get_fail() {queue<int> q;//提前处理第二层的fail指针for (int i = 0; i < 26; i++) {if (ac[0].pos[i]) {//指向根节点ac[ac[0].pos[i]].fail = 0;q.push(ac[0].pos[i]);}}//求fail指针while (q.size()) {int u = q.front();q.pop();//枚举所有子节点for (int i = 0; i < 26; i++) {//若子节点存在if (ac[u].pos[i]) {//子节点的fail指针指向当前节点的//fail指针所指向的节点的相同子节点ac[ac[u].pos[i]].fail = ac[ac[u].fail].pos[i];q.push(ac[u].pos[i]);//若子节点不存在} else {//当前节点的这个子节点指向当前//节点fail指针的这个子节点ac[u].pos[i] = ac[ac[u].fail].pos[i];}}}}int ac_query(string s) {int len = s.size();int cur = 0, res = 0;for (int i = 0; i < len; i++) {//继续下一层cur = ac[cur].pos[s[i]-'a'];for (int j = cur; j&&ac[j].ed!=-1; j = ac[j].fail) {res += ac[j].ed;ac[j].ed = -1;}}return res;}signed main() {int n;cin >> n;string s;for (int i = 1; i <= n; i++) {cin >> s;build(s);}ac[0].fail = 0; //结束标志get_fail(); //求失配指针string txt;cin >> txt;cout << ac_query(txt) << "\n";return 0;}
