zoukankan      html  css  js  c++  java
  • hdu2896

    数据水,但是各种wa各种t各种re最后照着别人的改了改发现了毛病

    数组做指针传入的时候系统是不知道传入后的数字的长度的如果用memset他就只会讲指针的地方清零

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int cha = 128;
    const int maxa = 110000;
    int n, m, k;
    struct Tire{
        int next[maxa][cha], fail[maxa], end[maxa];
        int root, L;
        int newnode(){
            for(int i = 0; i < cha; i++){
                next[L][i] = -1;
            }
            end[L++] = 0;
            return L-1;
        }
        void init(){
            L = 0;
            root = newnode();
        }
        void insert(char buf[], int k){
            int len = strlen(buf);
            int now = root;
            for(int i = 0; i < len; i++){
                if(next[now][buf[i]] == -1)
                    next[now][buf[i]] = newnode();
                now = next[now][buf[i]];
                //printf("%d ", now);
            }//puts("");
            end[now] = k;
        }
        void build(){
            queue<int>Q;
            fail[root] = root;
            for(int i = 0; i < cha; 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 now = Q.front();
                Q.pop();
                for(int i = 0; i < cha; i++){
                    if(next[now][i] == -1)
                        next[now][i] = next[fail[now]][i];
                    else{
                        fail[next[now][i]] = next[fail[now]][i];
                        Q.push(next[now][i]);
                    }
                }
            }
        }
        int ans[505];
        int solve(char *s, int id){
            int now = 0;
            int flag = 0;
            memset(ans, 0, sizeof(ans));
            for(int i = 0; s[i]; i++){
                now = next[now][s[i]];
                int j = now;
                while(j){
                    if(end[j]){//printf("*%d ", end[j]);
                        ans[end[j]] = true;
                        flag = 1;
                    }
                    j = fail[j];
                }
            }
            if(!flag) return 0;
            printf("web %d:",id);
            for(int i = 1;i <= n;i++)
                if(ans[i])
                    printf(" %d",i);
            printf("
    ");
            return 1;
    
        }
    };
    char buf[10015];
    Tire ac;
    int main(){
        scanf("%d", &n);
        ac.init();
        for(int i = 1; i <= n; i++){
            scanf("%s", buf);
            ac.insert(buf, i);
        }
        ac.build();
        scanf("%d", &m);
        int sum = 0;
        for(int i = 1; i <= m; i++){
            scanf("%s", buf);
            if(ac.solve(buf,i))
                sum ++;
        }
            printf("total: %d
    ",sum);
    }
    /*
    abcdefg
    bcdefg
    cdef
    de
    e
    ssaabcdefg
    
    
    */
    View Code
  • 相关阅读:
    C语言版本:单链表的实现(优化版本)
    C语言版本:单链表的实现
    C语言版本:顺序表的实现
    C++:多态浅析
    C++:同名隐藏和赋值兼容规则
    C++:钻石继承与虚继承
    C++:派生类的构造函数和析构函数的调用顺序
    Docker安装和使用
    Node10.15.0的安装
    碎碎叨叨
  • 原文地址:https://www.cnblogs.com/icodefive/p/4368765.html
Copyright © 2011-2022 走看看