当前位置: 首页 > news >正文

BZOJ 2099 [Usaco2010 Dec]Letter 恐吓信

BZOJ_2099

    一个可行的贪心思路就是,每次都让这刀切出的串越长越好,然后下一次再从上一刀末尾后面那个字符开始,继续这样贪心地去切。

    这样就要反复查询,从某个位置开始,最长能有多少个连续的字符满足是文章中的一个子串,这一点可以将文章建立后缀自动机后来查找,整体查找的复杂度是O(N)的。

#include<stdio.h>
#include<string.h>
#define MAXD 50010
struct SufAuto
{
    int pre, next[26], len;
    void init()
    {
        memset(next, 0, sizeof(next));
        pre = -1, len = 0;
    }
}sa[2 * MAXD];
namespace SA
{
    int node, tail;
    void init()
    {
        node = tail = 0;
        sa[0].init();
    }
    void insert(int k, int len)
    {
        int p = tail, np = ++ node;
        sa[np].init();
        sa[np].len = len;
        for(; p != -1 && !sa[p].next[k]; p = sa[p].pre) sa[p].next[k] = np;
        tail = np;
        if(p == -1) sa[np].pre = 0;
        else
        {
            if(sa[sa[p].next[k]].len == sa[p].len + 1) sa[np].pre = sa[p].next[k];
            else
            {
                int q = sa[p].next[k], r = ++ node;
                sa[r] = sa[q], sa[r].len = sa[p].len + 1;
                sa[q].pre = sa[np].pre = r;
                for(; p != -1 && sa[p].next[k] == q; p = sa[p].pre) sa[p].next[k] = r;
            }
        }
    }
}
int N, M;
char a[MAXD], b[MAXD], str[110];
void init()
{
    int cnt = 0;
    while(cnt < N)
    {
        scanf("%s", str);
        int n = strlen(str);
        strcpy(a + cnt, str);
        cnt += n;
    }
    cnt = 0;
    while(cnt < M)
    {
        scanf("%s", str);
        int n = strlen(str);
        strcpy(b + cnt, str);
        cnt += n;
    }
    SA::init();
    for(int i = 0; i < N; i ++) SA::insert(a[i] - 'A', i + 1);
}
void solve()
{
    int cnt = 0, cur = 0;
    while(cur < M)
    {
        for(int i = 0; b[cur] && sa[i].next[b[cur] - 'A']; i = sa[i].next[b[cur ++] - 'A']);
        ++ cnt;
    }
    printf("%d\n", cnt);
}
int main()
{
    while(scanf("%d%d", &N, &M) == 2)
    {
        init();
        solve();
    }
    return 0;
}

转载于:https://www.cnblogs.com/staginner/archive/2012/10/11/2719254.html

相关文章:

  • IOSUITableView展开隐藏资源
  • Flex结合java实现一个登录功能
  • winform窗体去掉标题头部的两种方式
  • Mac OS X背后的故事(十一)Mac OS X文件系统的来龙去脉(上)
  • java中异步计算之Future
  • string.Format以及IFormattable,IFormatProvider,ICustomFormatter
  • System.InvalidOperationException 异常
  • hdu 3818模拟
  • 传送门
  • 互联网创业的准备——版本控制与上线
  • C简单文件操作。。
  • CI中site_url()和base_url()的区别
  • VS2010 多线程编程
  • apex 返回标准的页面 standard view
  • 常量与变量的比较
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Flex布局到底解决了什么问题
  • JavaScript实现分页效果
  • Java应用性能调优
  • React的组件模式
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 关于for循环的简单归纳
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 入门到放弃node系列之Hello Word篇
  • 十年未变!安全,谁之责?(下)
  • 使用 Docker 部署 Spring Boot项目
  • 使用 QuickBI 搭建酷炫可视化分析
  • 通过git安装npm私有模块
  • 学习ES6 变量的解构赋值
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​MySQL主从复制一致性检测
  • ​第20课 在Android Native开发中加入新的C++类
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #在 README.md 中生成项目目录结构
  • (AngularJS)Angular 控制器之间通信初探
  • (zt)最盛行的警世狂言(爆笑)
  • (八)Spring源码解析:Spring MVC
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (接口自动化)Python3操作MySQL数据库
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • .NET 回调、接口回调、 委托
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET面试题(二)
  • .NET值类型变量“活”在哪?
  • @RunWith注解作用
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [Android View] 可绘制形状 (Shape Xml)
  • [Android]竖直滑动选择器WheelView的实现
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [CC-FNCS]Chef and Churu
  • [Java]深入剖析常见排序
  • [jobdu]不用加减乘除做加法
  • [LeetCode] 197. 上升的温度