【UVA】1449-Dominating Patterns(AC自己主动机)

【UVA】1449-Dominating Patterns(AC自己主动机)

大家好,又见面了,我是全栈君。

AC自己主动机的模板题。须要注意的是,对于每一个字符串,须要利用map将它映射到一个结点上,这样才干按顺序输出结果。

14360841 1449 Accepted C++ 0.146 2014-10-16 11:41:35

#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 150 * 75;
const int len  = 1111111;
const int max_size = 26;
char str[155][75];
char _str[len];
struct Trie{ //AC
    int tr[maxn][max_size];
    int fail[maxn];
    int val[maxn];     //结果
    int sz,root,_max;  //出现次数
    map<int,int>countx;//计算第i个字符串出现的次数
    map<string,int>vis;
    int index(char c){
        return c - 'a';
    }
    int newnode(){
        val[sz] = 0;
        for(int i = 0; i < 26; i++) tr[sz][i] = -1;
        sz ++;
        return sz - 1;
    }
    void init(){
        sz = 0;_max = 0;
        root = newnode();
        countx.clear();
        vis.clear();
    }
    void insert(char *s,int id){
         int u = root;
         int n = strlen(s);
         for(int i = 0; i < n; i++){
              int c = index(s[i]);
              //printf("%d %d\n",u,c);
              if(tr[u][c] == -1)
                   tr[u][c] = newnode();
              u = tr[u][c];
         }
         vis[string(s)] = u; //这个字符串相应的结点编号
         //printf("%d\n",u);
         val[u] ++;//达到这个结点的单词
    }
    void build(){
        queue<int>q;
        fail[root] = root;
        for(int i = 0; i < 26; i++){
            if(tr[root][i] == -1)
               tr[root][i] = root;
            else{
                fail[tr[root][i]] = root;
                q.push(tr[root][i]);
            }
        }
        while(!q.empty()){
            int now = q.front(); q.pop();
            for(int i = 0; i < 26; i++){
                if(tr[now][i] == -1)
                    tr[now][i] = tr[fail[now]][i];
                else{
                    fail[tr[now][i]] = tr[fail[now]][i];
                    q.push(tr[now][i]);
                }
            }
        }
    }
    void countt(char *s){
        int n = strlen(s);
        int u = root;
        for(int i = 0; i < n; i++){
            u = tr[u][index(s[i])];
            int temp = u;
            while(temp != root){
                if(val[temp]){           //这个结点存在单词
                    countx[temp]++;      //这个结点
                    _max = max(_max,countx[temp]);
                }
                temp = fail[temp];
            }
        }
    }
};
Trie ac;
int main(){
    int n;
    while(scanf("%d",&n) && n){
        ac.init();
        for(int i = 0; i < n; i++){
            scanf("%s",str[i]);
            ac.insert(str[i],i); //插入单词
        }
        //printf("%d\n",ac.sz);
        ac.build();
        scanf("%s",_str);
        ac.countt(_str);
        printf("%d\n",ac._max);
        for(int i = 0; i < n; i++){
            if(ac.countx[ac.vis[string(str[i])]] == ac._max)
               printf("%s\n",str[i]);
        }
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115847.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月29日 下午6:00
下一篇 2022年1月29日 下午7:00


相关推荐

  • Axure导航二级菜单[通俗易懂]

    Axure导航二级菜单[通俗易懂]    效果:当鼠标移入或者单击“权限管理”时,“权限管理”填充色由蓝变为白,字体由白变成黑。同时,弹出两个子选项“账号管理”和“设备管理”,当鼠标移入子选项时,该子选项背景变为灰白色。当鼠标移出母选项和子选项时,弹框隐藏,同时母选项背景和字体颜色恢复原状。原型设计:(1)设置元件的选中状态(2)设置鼠标移入或移出该组件的事件为了更好设计逻辑,我们采用触发的方式,新…

    2022年5月18日
    43
  • 手机端车牌号码键盘的vue组件

    手机端车牌号码键盘的vue组件

    2021年6月30日
    152
  • tfs安装教程_2008安装教程

    tfs安装教程_2008安装教程TFS2010安装配置一、安装过程注意:1、服务器内存要求2、需要SQLSERVER2005以上;3、选择“基础安”。二、TFS配置1、Server端配置。      (1)新建“团队项目集合”      (2)新建用户      注意:TFS的用户主要与windows用户结合2、Client端      注意:TFS与Client端与VS紧密整合,没有VSS那样的单独客户端(1)打开VS,连接到TFS      (2)创建“团队项目(3)将解决方案添加到TFS,右击解决方案,“添加到源代码

    2026年2月22日
    4
  • Java明星HD_javaHDvideo[通俗易懂]

    Java明星HD_javaHDvideo[通俗易懂]简介:javaHDvideo洪三摇头:“不在虎威赌坊,毕竟赌王盛会在华夏有些敏感,其实每年的中秋,虎王都会举办赌王大会,届时江宁江湖道上,有头有脸的人物都会参加,地点就在公海的游轮上。”崆峒派两名弟子嘿嘿笑道:“想不到你小子倒还有点自知之明。”“你……”铁无痕咬牙切齿。面对这几人相互挖苦嘲讽,唐锋不由摇了摇头,不过却是懒得搭理,当下抬头看向主席台道:“在接受挑战之前,在下有一个问题。”陆展鹏仍旧还…

    2022年7月7日
    24
  • 海量数据库解决方案 pdf(海量数据处理)

    作者序言这已经是第四次为本书写作者序言了,此时此刻过去20年的生活如同电影般在我的脑海里一一掠过。当我最初决定步入IT领域时就为自己立下了誓言,时至今日回想起多年走过的历程,其间充满了艰辛,也正是这无数的艰辛让我最终体验了收获的愉悦。回望这20多年的足迹,我一直努力用新的视角去观察他人所忽视的领域,尝试用崭新的思维和充满创意的双手去耕耘。尽管如此,也仍然无法紧跟IT技术飞快的发展步伐。我为实现理想而终日不停前行的脚步,虽然忙碌但却无限满足。众所周知,能够加工成宝石的原石比比皆是,一分耕耘,一分收

    2022年4月18日
    37
  • 电子琴入门教程视频电子琴简谱

    电子琴入门教程视频电子琴简谱电子琴入门教程视频电子琴简谱9套少儿电子琴教程1,儿童电子琴启蒙(上下集)2,儿童专用-简谱五线谱视频教程3,电子琴启蒙视频教程4,儿童电子琴启蒙-全套教程5,少儿电子琴教程6,少儿电子琴入门7,少年儿童电子琴初级、中级、高级教程8,经典儿童歌曲歌谱大全9,儿童电子琴启蒙文档网盘链接:链接:https://pan.baidu.com/s/1PpguBcJOeS82SzELRyG9PA提取码:love领到了给个赞鼓励下哦~…

    2022年8月29日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号