zoukankan      html  css  js  c++  java
  • hdu5384

    题意:给你n个母串。m个匹配串,让你求出对于每一个母串 全部匹配串出现的次数和。

    思路:完全然全邝斌的模板啊。。。 凝视掉一行代码就能a。。。


    代码:

    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstdlib>
    #include <cstring>
    #include <iomanip>
    #include <cstdio>
    #include <string>
    #include <bitset>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <list>
    #include <map>
    #include <set>
    #define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define mem1(a) memset(a,-1,sizeof(a))
    #define mem(a) memset(a,0,sizeof(a))
    #define ss(a,b) scanf("%d%d",&a,&b)
    #define s(a) scanf("%d",&a)
    #define p(a) printf("%d
    ", a)
    #define INF 0x3f3f3f3f
    #define w(a) while(a)
    #define PI acos(-1.0)
    #define LL long long
    #define eps 10E-9
    #define N 100010
    #define mod 258280327
    const int SIGMA_SIZE=26;
    const int MAXN=100010;
    const int MAXNODE=600010;
    using namespace std;
    void mys(int& res)
    {
        int flag=0;
        char ch;
        while(!(((ch=getchar())>='0'&&ch<='9')||ch=='-'))
            if(ch==EOF)  res=INF;
        if(ch=='-')  flag=1;
        else if(ch>='0'&&ch<='9')  res=ch-'0';
        while((ch=getchar())>='0'&&ch<='9')  res=res*10+ch-'0';
        res=flag?-res:res;
    }
    void myp(int a)
    {
        if(a>9)
            myp(a/10);
        putchar(a%10+'0');
    }
    /*************************THE END OF TEMPLATE************************/
    char str1[N][10001];
    char s[N];
    int m, ans;
    struct ac_trie{
            int next[500010][26], ed[500010], fail[500010];
            int root, L;
            int newnode(){
                for(int i=0; i<26; i++) next[L][i] = -1;
                ed[L++] = 0;
                return L-1;
            }
            void init(){
                L = 0;
                root = newnode();
            }
            void m_insert(char *s){
                int len = strlen(s);
                int now = root;
                for(int i = 0; i<len; i++){
                    if(next[now][s[i]-'a'] == -1) next[now][s[i]-'a'] = newnode();
                    now = next[now][s[i]-'a'];
                }
                ed[now]++;
            }
            void getfail(){
                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]);
                    }
                w(!Q.empty()){
                    int now = Q.front();
                    Q.pop();
                    for(int i=0; i<26; 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 query(char *s){
                int len = strlen(s);
                int now = root;
                int res = 0;
                for(int i=0; i<len; i++){
                    now = next[now][s[i]-'a'];
                    int temp = now;
                    w(temp!=root){
                       res += ed[temp];
                       //ed[temp] = 0;
                       temp = fail[temp];
                    }
                }
                return res;
            }
    };
    ac_trie ac;
    int main(){
        int t, n;
        s(t);
        w(t--){
             ss(n, m);
             ac.init();
             for(int i=0; i<n; i++) scanf("%s",str1[i]);
             for(int i=0; i<m; i++){
                scanf("%s", s);
                ac.m_insert(s);
             }
             ac.getfail();
             for(int i=0; i<n; i++)  p(ac.query(str1[i]));
        }
        return 0;
    }
    


  • 相关阅读:
    Cesium中监听MOUSE_MOVE事件获取经纬度和高度
    CentOS系统重命名
    docker安装步骤
    nginx发布vue 项目
    解决git 本地代码与远程仓库冲突问题
    js通过className删除元素
    bootstrap treeview基本运用
    自定义组件模拟v-model
    使用a标签下载**.txt文件, 而不是直接打开
    mongoose 开源http库
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6823535.html
Copyright © 2011-2022 走看看