首先 先給你q 個查詢串 ,再給你乙個主串s (或者很多個不同主串)
q個查詢串 有幾個 在主串裡 匹配成功了 可以記個cnt統計(查詢串不重複,重複的要計算數量的話,要加個sum記錄 重複查詢串 出現了幾次)
還可以知道 匹配成功 的查詢串是哪些(偷懶還用 sum標 它是第幾個查詢串)
字典樹就不用說了吧,建字典樹還是很好理解的
假設先匹配成功了一小段,那麼找下乙個字母,匹配成功的這一段的最後乙個 的下乙個字元。
貼上**
#include #include #include #include #include #include #include #include #include #include #include #include #define clear( x , y ) memset( x , y , sizeof(x) );
#define qcin() std::ios::sync_with_stdio(false);
using namespace std;
typedef long long ll;
const int maxn = 1e4 + 200;
const int inf = 1e9 + 7;
const int max = 1e7;
int cnt , n;
struct node;
node *root , *q[max] , *newnode;
char key[210];
char pattern[maxn];
int head,tail;
void insert(char *s)
p = p->next[x];
}p->sum++;
}void build_fail_pointer()
else
p = p->fail;
}if(p == null) temp->next[i]->fail = root;
}q[tail++] = temp->next[i];}}
}}void ac_automation(char *ch)
else break;
temp = temp->fail;}}
}int main()
gets(pattern);
cnt = 0;
build_fail_pointer();
ac_automation(pattern);
printf("%d\n",cnt);
}return 0;
}
感覺**還能更好看一點
//hdu 2896
#include #include #include #include #include #include #include #include #include #include #include #include #define printstring(ss) printf("%s\n",ss);
#define clear( x , y ) memset( x , y , sizeof(x) );
#define qcin() std::ios::sync_with_stdio(false);
using namespace std;
typedef long long ll;
const int maxn = 1e4 + 200;
const int inf = 1e9 + 7;
const int over = 130;
int cnt , n;
struct node
fail = null;
sum = 0;
}};node *root , *newnode;
char key[210];
char pattern[maxn];
int head,tail;
void insert(char *s , int num)
p = p->next[x];
} p->sum = num;
}queue q;
void build_fail_pointer() else
p = p->fail;
}if(p == null) temp->next[i]->fail = root;
}q.push(temp->next[i]);
}} }
}vector ans;
void ac_automation(char *ch)
else break;
temp = temp->fail;
} }}int main()
build_fail_pointer();
int q; scanf(" %d",&q);
cnt = 0;
for(int i = 1 ; i <= q ; i++)
printf("\n");
} }printf("total: %d\n",cnt);
return 0;
}
AC自動機講解
飄過的小牛 ac自動機簡介 首先簡要介紹一下ac自動機 aho corasick automation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹t...
AC自動機講解
首先,作為作者的我一定知道你已經會了這兩個演算法 kmp與trie樹,如若不會,可以先學習一下。我在這裡宣告一下ac自動機不是自動ac的演算法,其全稱是aho corasick automaton,是一種著名的多模匹配演算法。其實現類似於trie樹與kmp演算法的結合,是將多個模式串放在trie樹上...
AC自動機模板
ac自動機模板 ac自動機模板 使用方法 1 init 初始化函式 2 insert str 插入字串函式 3 build 構建ac自動機 4 query str 返回出現的字串個數 使用需注意事項 1 注意輸入的字元的範圍,需對next和其二維大小及相關引數進行更改 2 注意next fail和e...