hdu2222ac自动机或者裸字典树

ac自动机代码

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>

using namespace std;
#define id(a) (a-'a')
const int maxnode=10000*50+10;
int ch[maxnode][26];
int f[maxnode];
int val[maxnode];
int sz;
int insert(char *s){
    int u = 0;
    for(int i = 0;s[i];i++){
        int c = id(s[i]);
        if(!ch[u][c]){
            memset(ch[sz],0,sizeof(ch[sz]));
            val[sz] = 0;
            f[sz] = 0;
            ch[u][c] = sz++;
        }
        u = ch[u][c];
    }
    val[u] ++;
}
int find_fail(){
    int u = 0;
    queue<int> que;
    f[0]= 0;
    for(int i = 0;i < 26;i++){
        int u = ch[0][i];
        if(u){
            f[u] = 0;
            que.push(u);        
        }
    }
    while(!que.empty()){
        int r = que.front();
        que.pop();
        for(int i = 0;i < 26;i++){
            if(!ch[r][i]){
                ch[r][i] = ch[f[r]][i];
            }
            else{
                f[ch[r][i]] = ch[f[r]][i];
                que.push(ch[r][i]); 
            }
        }
    }
}
int query(char *s){
    int u = 0;
    int ans = 0;
    for(int i = 0;s[i];i++){
        u = ch[u][id(s[i])];
        int tmp = u;
        while(tmp){
            ans += val[tmp] ;
            val[tmp] = 0;
            tmp = f[tmp];
        }
    }
    printf("%d\n",ans);
    return ans;
}
char s[1000005];
char a[100];
int main(){
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        sz = 1;
        memset(ch[0],0,sizeof(ch[0]));
        val[0]= 0;
        f[0] =0;
        for(int i = 0;i < n;i++){
            scanf("%s",a);
            insert(a);
        }
        find_fail();
        scanf("%s",s);
        query(s);

    }
}

裸trie代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <stack>
#include <set>
#include <map>
#include <vector>

using namespace std;
#define INF 0x2fffffff
#define LL long long
#define MAX(a,b) ((a)>(b))?(a):(b)
#define MIN(a,b) ((a)<(b))?(a):(b)
#define id(a) ((a)-'a')
const int maxnode = 10000*50+10;
int ch[maxnode][26];
int val[maxnode];
int sz = 0;
int insert(char *s){
    int len =strlen(s);
    int u = 0;
    for(int i = 0;i < len;i++){
        int c = id(s[i]);
        if(!ch[u][c]){
            memset(ch[sz],0,sizeof(ch[sz]));
            val[sz] = 0;
            ch[u][c] = sz++;
        }
        u = ch[u][c];           
    }
    val[u] ++;
}

int query(char *s){
    int ans = 0;
    for(int i = 0;s[i];i++){
        int c = id(s[i]);
        int u = 0;
        int j = 0;
        while(ch[u][c]){
            if(val[ch[u][c]]){
                ans += val[ch[u][c]];
                val[ch[u][c]] = 0;
            }
            u = ch[u][c];
            j ++;
            c = id(s[i+j]);
        }
    }
    printf("%d\n",ans);
}
char s[1000005]; 
int main(){
    int t;
    freopen("1.txt","r",stdin);
    freopen("2.txt","w",stdout);
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        char a[100];
        memset(ch[0],0,sizeof(ch[0]));
        val[0]= 0;
        sz = 1;
        for(int i = 0;i < n;i++){
            scanf("%s",a);
            insert(a);
        }
        scanf("%s",s);
        query(s);
    }
    return 0;
}

裸字典树的时候只要了600多ms,写ac自动机却用了700多ms,而且开始的时候不知道哪里错了,一直wa,tle,re,mle,这哪里是ac自动机啊,分明是wa自动机,tle自动机,re自动机,mle自动机啊 !

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值