zoukankan      html  css  js  c++  java
  • 模板统计LA 4670 Dominating Patterns

    本篇文章是一篇关于模板统计的帖子

        题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=29&page=show_problem&problem=2671

        统计文本中模板单词的涌现频率。

        AC自动机模板题:

        每日一道理
    人生是洁白的画纸,我们每个人就是手握各色笔的画师;人生也是一条看不到尽头的长路,我们每个人则是人生道路的远足者;人生还像是一块神奇的土地,我们每个人则是手握农具的耕耘者;但人生更像一本难懂的书,我们每个人则是孜孜不倦的读书郎。
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <map>
    #include <queue>
    #include <algorithm>
    using namespace std;
    
    #define SIGMA_SIZE 26
    #define MAXNODE 20000
    #define TEXT_SIZE 1000005
    #define P_SIZE 80
    #define P_NUM 160
    
    map<string,int> ms;
    struct AcCorsickAutomata
    {
        int cnt[P_NUM];
        int sz;
        int ch[MAXNODE][SIGMA_SIZE];
        int f[MAXNODE];
        int val[MAXNODE];
        int last[MAXNODE];
        void init()
        {
            sz = 1;
            memset(ch[0],0,sizeof(ch[0]));
            memset(cnt,0,sizeof(cnt));
            ms.clear();
        }
        int idx(char c)
        {
            return c - 'a';
        }
        void insert(char *s,int v)
        {
            int u = 0,n = strlen(s);
            for(int i=0; i<n; i++)
            {
                int c = idx(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] = v;
            ms[string(s)] = v;
        }
    
        void print(int j)
        {
            if(j)
            {
                cnt[val[j]]++;
                print(last[j]);
            }
        }
        void find(char *T)
        {
            int n = strlen(T);
            int j = 0;
            for(int i=0; i<n; i++)
            {
                int c = idx(T[i]);
                while(j && !ch[j][c]) j = f[j];
                j = ch[j][c];
                if(val[j]) print(j);
                else if(last[j]) print(last[j]);
            }
        }
        void getFail()
        {
            queue<int> q;
            f[0] = 0;
            for(int c = 0; c<SIGMA_SIZE; c++)
            {
                int u = ch[0][c];
                if(u)
                {
                    f[u] = 0;
                    q.push(u);
                    last[u] = 0;
                }
            }
            while(!q.empty())
            {
                int r = q.front();
                q.pop();
                for(int c = 0; c<SIGMA_SIZE; c++)
                {
                    int u = ch[r][c];
                    if(!u) continue;
                    q.push(u);
                    int v = f[r];
                    while(v && !ch[v][c]) v = f[v];
                    f[u] = ch[v][c];
                    last[u] = val[f[u]] ? f[u] : last[f[u]];
                }
            }
        }
    };
    AcCorsickAutomata ac;
    char text[TEXT_SIZE],p[P_NUM][P_SIZE];
    int main()
    {
    /*#ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif*/
        int n;
        while(scanf(" %d",&n)!=EOF && n!=0)
        {
            ac.init();
            for(int i=1; i<=n; i++)
            {
                scanf(" %s",p[i]);
                ac.insert(p[i],i);
            }
            scanf(" %s",text);
            ac.getFail();
            ac.find(text);
            int best = -1;
            for(int i=1; i<=n; i++)
            {
                if(ac.cnt[i] > best) best = ac.cnt[i];
            }
            printf("%d\n",best);
            for(int i=1; i<=n; i++)
            {
                if(ac.cnt[ms[string(p[i])]] == best) printf("%s\n",p[i]);
            }
        }
        return 0;
    }

        

    文章结束给大家分享下程序员的一些笑话语录: 开发时间
      项目经理: 如果我再给你一个人,那可以什么时候可以完工?程序员: 3个月吧!项目经理: 那给两个呢?程序员: 1个月吧!
    项目经理: 那100呢?程序员: 1年吧!
    项目经理: 那10000呢?程序员: 那我将永远无法完成任务.

    --------------------------------- 原创文章 By
    模板和统计
    ---------------------------------

  • 相关阅读:
    java八大数据类型
    变量,常量,作用域
    位运算符
    可变参数
    重写
    javascript中各种循环总结
    前端高效emmit快捷键
    移动端列表页布局
    sublime text3中添加插件CSScomb方法
    友元类头文件互相包含问题
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3098996.html
Copyright © 2011-2022 走看看