HDU 6138 Fleet of the Eternal Throne

自己的模板

#include<iostream>
#include<stdlib.h>
#include<queue>
#include<string.h>
#include<stdio.h>
using namespace std;
struct node
{
    node* next[26];
    node* trien,*father;
    int value ,flag;
    node(char value,node* father):flag(0),value(value),trien(NULL),father(father)
    {
        memset(next,NULL,sizeof(next));
    }
};
node* root=new node(-1,NULL);
string passage;
void build(string word)
{
    int l=word.length(),va;
    node* n1 = root;
    for(int i =0 ; i< l; i++)
    {
        va=word[i]-'a';
        if(n1->next[va]== NULL)
            n1->next[va] = new node(va,n1);
        n1=  n1->next[va];
    }
    n1->flag=1;

}

void init()
{
    queue<node*> nodeq;
    node * n1=root;
    root->trien = root;

    for(int i=0; i<26; i++)
    {
        if(n1->next[i]!=NULL)
            nodeq.push(n1->next[i]);
    }


    for(int i=0; i<26; i++)
    {
        if(root->next[i]==NULL)
            root->next[i] = root;
    }
        while(!nodeq.empty())
        {
            n1= nodeq.front();
            if(n1->father==root)
                n1->trien= root;
            else
                n1->trien = (n1->father->trien)->next[n1->value];
            node* n2 = n1->trien;
            nodeq.pop();
            for(int i=0; i<26; i++)
            {
                if(n1->next[i]!=NULL)
                    nodeq.push(n1->next[i]);
            }

            for(int i=0; i<26; i++)
            {
                if(n1->next[i]==NULL)
                    n1->next[i] = n2->next[i];

            }
        }

}

    bool findn()
    {
        int l = passage.length();
        node * n1 =root;
        for(int i =0 ; i< l ; i++)
        {
            if(n1->flag==1)
                return true;
            if(n1->next[passage[i]-'a']!=NULL)
                n1=n1->next[passage[i]-'a'];
        }
        if(n1->flag==1)
            return true;
        return false;

    }
    int main()
    {
        int n,m;
        string word;
        char c;
        cin>>n;
        for(int i= 0; i < n; i++)
        {
            cin>>word;
            build(word);
        }

        init();
        cin>>passage;
        bool ans= findn();
        if(ans)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
        return 0;
    }


网上的代码更全的模板

#include <cstdio>  
#include <cstring>  
#include <algorithm>  
#include <queue>  
using namespace std;  
  
  
const int maxn = 100000 + 10 << 1;  
  
struct Trie{  
    int len[maxn];  
    int next[maxn][26];  
    int fail[maxn];  
    int flag[maxn];  
    int root;  
    int L;  
  
  
    void init(){  
        L = 0;  
        root = newnode();  
        len[root] = 0;  
    }  
    int newnode(){  
        for (int i = 0; i < 26; ++i){  
            next[L][i] = -1;  
        }  
        flag[L] = 0;  
        return L++;  
    }  
  
    void insert(char* s){  
        int nod = root;  
        int lens = strlen(s);  
        for (int i = 0; i < lens; ++i){  
            int id = s[i] - 'a';  
            if (next[nod][id] == -1){  
                next[nod][id] = newnode();  
            }  
            len[next[nod][id] ] = len[nod] + 1;  
            nod = next[nod][id];  
        }  
    }  
  
    void build(){  
        queue<int>q;  
        fail[root] = root;  
  
        for (int i = 0; i < 26; ++i){  
            if (next[root][i] == -1){  
                next[root][i] = root;  
  
            }  
            else {  
                fail[next[root][i] ] = root;  
                q.push(next[root][i]);  
            }  
        }  
        while(!q.empty()){  
            int u = q.front(); q.pop();  
  
            for (int i = 0; i < 26; ++i){  
                if (next[u][i] == -1){  
                    next[u][i] = next[fail[u] ][i];  
  
                }  
                else {  
  
                    fail[next[u][i]] = next[fail[u]][i];  
                    q.push(next[u][i]);  
                }  
            }  
        }  
    }  
  
  
    void update(char* s, int vis){  
        int lens = strlen(s);  
        int nod = root;  
        for (int i = 0; i < lens; ++i){  
            int id = s[i] - 'a';  
            nod = next[nod][id];  
            int tmp = nod;  
            while(tmp != root){  
                flag[tmp] = vis;  
                tmp = fail[tmp];  
            }  
        }  
    }  
    int query(char* s, int vis){  
        int lens = strlen(s);  
        int nod = root;  
        int ans = 0;  
        for (int i = 0; i < lens; ++i){  
            int id = s[i] - 'a';  
            nod = next[nod][id];  
            int tmp = nod;  
            while(tmp != root){  
                if (flag[tmp] == vis){  
                    ans = max(ans, len[tmp]);  
                }  
                tmp = fail[tmp];  
            }  
        }  
        return ans;  
  
    }  
  
  
  
  
  
}ac;  
  
  
char s[maxn];  
int d;  
  
int pos[maxn];  
int main(){  
  
    int T;  
    scanf("%d",&T);  
    while(T--){  
        int n;  
        scanf("%d", &n);  
        d = 0;  
        ac.init();  
        for (int i = 0; i < n; ++i){  
            pos[i] = d;  
            scanf("%s", s + d);  
            ac.insert(s + d);  
            int len = strlen(s + d);  
            d += len + 1;  
        }  
        ac.build();  
        int q;  
        scanf("%d", &q);  
        int vis = 1;  
        while(q--){  
            int x, y;  
            scanf("%d %d", &x, &y);  
            --x;--y;  
            ac.update(s + pos[x], vis);  
            int ans = ac.query(s + pos[y], vis);  
            ++vis;  
            printf("%d\n", ans);  
        }  
    }  
  
    return 0;  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值