2015湖南省队集训DAY6——B题(BZOJ4179)

原创 2015年07月08日 20:50:59

题面挺扯的,我就直接说人话算了。
题目大意:给你若干个病毒串,问你能不能构造出长度大于n的字符串使其中不出现任何一个字符串。
多组数据,总文件大小小于1M
题解:
联动:BZOJ2938
基本是原题,稍作了改动。
考虑ac自动机。
所求即为ac自动机中是否存在长度大于等于l的路径
先将所有的串插进去,然后构造失配指针。
显然的,插入后的末端节点肯定是不能经过的。
但仅这样显然是不可以的,我们考虑在匹配时,如果失配指针指向的节点是danger节点,那么这个节点也是不能经过的(显然)。
所以考虑ac自动机还剩下的节点,如果这张图中有环,那么一定存在长度大于等于l的路径(显然)。如果没有,剩下的就是个DAG,DAG上的最长路就是一傻逼问题。

代码丑,见谅

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;

const int inf=0x3f3f3f3f;

int getint()
{
    int f=1,g=0;char c=getchar();
    while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0' && c<='9')g=(g<<3)+(g<<1)+c-'0',c=getchar();
    return f*g;
}

const int maxsize=1000005;
const int maxk=2;

int s,l;

namespace Aho_Corasick_Automaton{

    int next[maxsize][maxk];
    bool flag[maxsize];
    int fail[maxsize];
    int root;
    int tot;

    void init()
    {
        memset(next,-1,sizeof next);
        memset(flag,false,sizeof flag);
        memset(fail,0,sizeof fail);
        tot=0;
    }

    char st[maxsize];

    void insert()
    {   
        int now=root;
        int len=strlen(st+1);
        for(int i=1;i<=len;i++)
        {
            if(next[now][st[i]=='T']==-1)
            {
                next[now][st[i]=='T']=++tot;                
            }
            now=next[now][st[i]=='T'];
        }
        flag[now]=true;
    }

    void build()
    {
        queue<int> q;
        fail[root]=root;

        for(int i=0;i<2;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();
            flag[now]|=flag[fail[now]];
            for(int i=0;i<maxk;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]);
                }
            }
        }
        /*
        for(int i=1;i<=tot;i++)
        {
            if(flag[fail[i]])
            {
                flag[i]=true;
            }
        }*/     
    }

    bool vis[maxsize];
    int f[maxsize];
    bool find;

    void dfs(int x,int len)
    {
        if(find)return;
        if(flag[x])return;
        if(len>=l)
        {
            find=true;
            return;
        }
        if(vis[x])
        {
            find=true;
            return;
        }
        vis[x]=true;
        for(int i=0;i<maxk;i++)
        {
            dfs(next[x][i],len+1);
        }
        vis[x]=false;       
    }

    void solve()
    {
        init();
        memset(vis,false,sizeof vis);
        find=false;
        for(int i=1;i<=s;i++)
        {
            scanf("%s",st+1);
            insert();
        }
        //puts("readin ok");
        build();
        //puts("build ok");
        memset(f,-1,sizeof f);
        dfs(root,0);
        if(find)puts("Yes");
        else puts("No");
    }
};


int main()
{
//  freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);

    while(scanf("%d %d",&s,&l)!=EOF)
    {
        Aho_Corasick_Automaton::solve();
    }

    return 0;
}

orz今天ak的zyf大爷

2016年湖南省第十二届大学生计算机程序设计竞赛 解题报告

2016年湖南省第十二届大学生计算机程序设计竞赛 解题报告 csu Problem A: 2016 Problem B:有向无环图 Problem C:Three Capitals Problem D...
  • no_name233
  • no_name233
  • 2016年09月07日 19:44
  • 1425

2016年第七届蓝桥杯c/c++省赛B组

2016年第七届蓝桥杯c/c++省赛B组 煤球数目 生日蜡烛 凑算式 快速排序 抽签 方格填数 剪邮票 四平方和 交换瓶子 最大比例...
  • star92014
  • star92014
  • 2016年03月21日 09:00
  • 7963

[NOIP2016游记]Mengbier的考场实录&论今年GD省队名额是如何被减的

Before Exam第三次参加提高组:想想初二时年少气盛水到了400+,到了初三时爆空间惨跌至300+,而不觉已是一名高一党,每一场比赛越来越显得前所未有的重要,就让我感到十分愈来愈浓郁的紧张。毕竟...
  • a_crazy_czy
  • a_crazy_czy
  • 2016年11月22日 22:40
  • 1806

2015湖南省选集训DAY5——work(BZOJ4177)

DescriptionMike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可...
  • Starry__Night
  • Starry__Night
  • 2015年07月08日 15:54
  • 838

2015湖南省队集训DAY8——梦工厂

梦工厂 (yume.cpp/c/pas)Time Limit: 1 s Memory Limit: 128 M 问题描述「有时候用烂了的名字也会别有深意」 ——摘自EN 语录 “这里是...
  • Starry__Night
  • Starry__Night
  • 2015年07月11日 20:37
  • 578

2015湖南省队集训DAY3——Light

Light【问题描述】“若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引 对方表现出兴趣的话,那就慢慢地反问。在她考虑答案的时候,趁机逃吧。就算是很简 问题,她一定也答不...
  • Starry__Night
  • Starry__Night
  • 2015年07月07日 20:57
  • 595

暑期集训Day2训练赛D题Spreadsheets(codeforces 1B)

应该是一道比较简单的模拟题,然而弱菜如我纠结于1WA好久。最终找到的错误竟是不久前犯过的错误,所以,数字转字符时模26是一定考虑”Z“这个特殊情况的。 #include #include #i...
  • Guang_Novak
  • Guang_Novak
  • 2016年07月21日 13:43
  • 239

[树的同构][二分][可并堆维护哈希] LOJ#6066 || BZOJ4928 && 2017 山东一轮集训 Day3. 第二题

这题一看就可以二分 那么解决这题的关键就变成了怎么对树进行哈希,以及怎么快速维护哈希值 想了一个下午想了一个比较靠谱的哈希方法。 用一个p进制数(p>n且为质数)来表示每一个节点,这个数有dep...
  • Coldef
  • Coldef
  • 2017年07月11日 18:07
  • 333

[计数][容斥] LOJ#6065 || BZOJ4927 && 2017 山东一轮集训 Day3. 第一题

因为要选6根木棒,发现肯定是1,1,2,2或1,1,1,3形式。 可以枚举2和3的部分,然后推一推,容斥容斥就可以了 但是细节贼多#include #include #include #in...
  • Coldef
  • Coldef
  • 2017年07月11日 17:48
  • 338

湖南2015省队集训(bzoj4174)tty的求助

文章来自我的新博客题外话:    ~~~~当时我们老师要我们三个人出一套题目给 noinoi 集训,然后我们当时就吓尿了!!!各种担心出的题目太水被秒。。。。。然而事实上效果还不错,只有 yytyyt...
  • qq_21995319
  • qq_21995319
  • 2015年09月08日 13:11
  • 749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2015湖南省队集训DAY6——B题(BZOJ4179)
举报原因:
原因补充:

(最多只允许输入30个字)