bzoj 1030

来源:互联网 发布:清洁pcb的玻璃笔淘宝 编辑:程序博客网 时间:2024/06/18 17:11

AC自动机模板


#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <string>#include <map>#include <vector>#include <stack>#include <queue>#include <utility>#include <iostream>#include <algorithm>template<class Num>void read(Num &x){    char c; int flag = 1;    while((c = getchar()) < '0' || c > '9')        if(c == '-') flag *= -1;    x = c - '0';    while((c = getchar()) >= '0' && c <= '9')        x = (x<<3) + (x<<1) + (c-'0');    x *= flag;    return;}template<class Num>void write(Num x){    if(x < 0) putchar('-'), x = -x;    static char s[20];int sl = 0;    while(x) s[sl++] = x%10 + '0',x /= 10;    if(!sl) {putchar('0');return;}    while(sl) putchar(s[--sl]);}const int maxn = 105, maxl = 105, size = 26, Mod = 10007;struct TrieNode{    TrieNode *p[size], *fail;    bool end;    int dp[maxl];}T[maxn*maxl], *root;int n, m, tot;char c[maxl];TrieNode *NewNode(){    return T + (++tot);}void insert(char *t,TrieNode *now){    if(!(*t))     {        now->end = true;        return;    }    TrieNode *&next = now->p[(*t)-'A'];    if(!next) next = NewNode();    insert(t + 1, next);}void init(){    read(n), read(m);    root = NewNode();     for(int i = 1; i <= n; i++)    {        scanf("%s",c);        insert(c, root);    }}void build(){    std::queue<TrieNode*>line;    root->fail = root;    for(int i = 0; i < size; i++)        if(root->p[i])        {            root->p[i]->fail = root;            line.push(root->p[i]);        }        else            root->p[i] = root;      while(!line.empty())    {        TrieNode *x = line.front();        line.pop();        for(int i = 0; i < size; i++)        {            if(x->p[i])            {                x->p[i]->fail = x->fail->p[i];                line.push(x->p[i]);             }            else                x->p[i] = x->fail->p[i];        }        if(x->fail->end) x->end = true;    }}void update(int len){       for(int x = 1; x <= tot; x++)         for(int i = 0; i < size; i++)            if(!T[x].p[i]->end)            {                T[x].p[i]->dp[len] += T[x].dp[len-1];                T[x].p[i]->dp[len] %= Mod;            }}long long getans(){    long long ans = 0, sum = 1;    for(int i = 1; i <= tot; i++)        ans += T[i].dp[m], ans %= Mod;    for(int i = 1; i <= m; i++)        sum *= size, sum %= Mod;    ans = (sum - ans + Mod)%Mod;    return ans; }int main(){#ifndef ONLINE_JUDGE    freopen("1030.in","r",stdin);    freopen("1030.out","w",stdout);#endif    init(), build();    root->dp[0] = 1;    for(int i = 1; i <= m; i++)        update(i);    write(getans());#ifndef ONLINE_JUDGE    fclose(stdin);    fclose(stdout);#endif    return 0;       }
0 0
原创粉丝点击