【链接】h在这里写链接

【题意】

    给你n个单词;
    这n个单词组成了一篇文章;
    问你每个单词在这篇文章中出现了多少次.
    其中每个单词之间用一个逗号隔开->组成一篇文章。
    (单词的总长度不会超过10^6)
    单词的个数小于等于200

【题解】

    后缀数组题.
    把每个字符串用一个分隔符分开来.
    然后求其后缀数组;

然后先获取每个单词后缀的排名;
    然后往左走直到lcp小于这个单词的长度,
    然后往右走直到lcp小于这个单词的长度
    向左走和向右走的区间就是这个单词在文章中出现的次数。

暴力做一下就好;
    如果想优化的话,感觉可以再加一个二分。
    因为长度越长,显然lcp是越来越小的。。
    啦啦啦
    但是不用加这个优化就可以过啦。
    听网上的人说的。。

【错的次数】

0

【反思】

在这了写反思

【代码】

#include<bits/stdc++.h>
using namespace std;const int N = 1e6 + 500;
const int MAX_CHAR = 500;//每个数字的最大值。
int s[N + 10];//如果是数字,就写成int s[N+10]就好,从0开始存
int Sa[N + 10], T1[N + 10], T2[N + 10], C[N + 10];
int Height[N + 10], Rank[N + 10];void build_Sa(int n, int m) {int i, *x = T1, *y = T2;for (i = 0; i<m; i++) C[i] = 0;for (i = 0; i<n; i++) C[x[i] = s[i]]++;for (i = 1; i<m; i++) C[i] += C[i - 1];for (i = n - 1; i >= 0; i--) Sa[--C[x[i]]] = i;for (int k = 1; k <= n; k <<= 1){int p = 0;for (i = n - k; i<n; i++) y[p++] = i;for (i = 0; i<n; i++) if (Sa[i] >= k) y[p++] = Sa[i] - k;for (i = 0; i<m; i++) C[i] = 0;for (i = 0; i<n; i++) C[x[y[i]]]++;for (i = 1; i<m; i++) C[i] += C[i - 1];for (i = n - 1; i >= 0; i--) Sa[--C[x[y[i]]]] = y[i];swap(x, y);p = 1; x[Sa[0]] = 0;for (i = 1; i<n; i++)x[Sa[i]] = y[Sa[i - 1]] == y[Sa[i]] && y[Sa[i - 1] + k] == y[Sa[i] + k] ? p - 1 : p++;if (p >= n) break;m = p;}
}void getHeight(int n)
{int i, j, k = 0;for (i = 1; i <= n; i++) Rank[Sa[i]] = i;for (i = 0; i<n; i++) {if (k) k--;j = Sa[Rank[i] - 1];while (s[i + k] == s[j + k]) k++;Height[Rank[i]] = k;}
}int n, fir[200 + 10],le[200+10];
char ts[N + 10];int main()
{//freopen("F:\\rush.txt", "r", stdin);int t;scanf("%d", &t);for (int ii = 1;ii <= t;ii++){scanf("%s", ts);int len = strlen(ts);le[ii] = len;fir[ii] = n;for (int i = 0; i < len; i++)s[n++] = ts[i];s[n++] = 'z' + ii;//不能是字符类型,可能会爆掉!}s[n] = 0;build_Sa(n + 1, MAX_CHAR);//注意调用n+1getHeight(n);for (int i = 1; i <= t; i++){int temp = Rank[fir[i]],temp1 = temp,ans = 1;while (temp - 1 >= 1 && Height[temp] >= le[i]){ans++;temp--;}while (temp1 + 1 <= n && Height[temp1 + 1] >= le[i]){ans++;temp1++;}printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7625980.html

【BZOJ 3172】单词相关推荐

  1. bzoj 3172: [Tjoi2013]单词 AC自动机

    3172: [Tjoi2013]单词 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  2. fail树(bzoj 3172: [Tjoi2013]单词)

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4223  Solved: 2051 [Submit][Stat ...

  3. 学习笔记:AC自动机

    话说AC自动机有什么用......我想要自动AC机 AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配 ...

  4. linux springboot开机启动,SpringBoot 部署到Linux开机自启动和运行

    前文 SpringBoot是一个强大的微服务框架,通常都是打包项目成Jar包,并部署到服务器上,本文以Linux服务器部署为主 开机自启动 运行 Jar包部署到Linux服务器上面,不能使用常用的运行 ...

  5. AC自动机及KMP练习

    好久都没敲过KMP和AC自动机了.以前只会敲个kuangbin牌板子套题.现在重新写了自己的板子加深了印象.并且刷了一些题来增加自己的理解. KMP网上教程很多,但我的建议还是先看AC自动机(Trie ...

  6. linux java读取文件夹下文件名,Java获取Linux上指定文件夹下所有第一级子文件夹...

    说明:需要只获得第一级文件夹目录 package com.sunsheen.jfids.studio.monitor.utils; import java.io.BufferedReader; imp ...

  7. bzoj 2905 背单词

    Description 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使得其 中的每个单词是后一个单词的子串,最大化子序列中W的和. Input 第一行一个整数TEST,表示数据 ...

  8. BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...

  9. #快速幂,eratosthenes筛#bzoj 3930 洛谷 3172 选数

    题目 从区间 [ l ∼ r ] [l\sim r] [l∼r]中选取 n n n个整数,总共有 ( r − l + 1 ) n (r-l+1)^n (r−l+1)n种方案.问最大公约数刚好为 k k ...

  10. 如何用python完成评分功能呢_从文件python进行单词分析和评分

    我正在对一个句子进行逐词分析,例如 "嘿!这是一部很棒的电影???" 我上面有很多句子. 我有一个巨大的数据集文件,如下所示,如果该词存在,我必须进行快速查找.如果这样做,则进行分 ...

最新文章

  1. u-boot移植问题记录(一)--U_BOOT_CMD区别
  2. 数据解密2020年高考,志愿填报可以选这些
  3. omct问题之-webapps下多出的ROOT目录
  4. 为什么你需要将代码迁移到ASP.NET Core 2.0?
  5. js bool true false 比较
  6. python 微服务架构实战_《分布式服务架构:原理、设计与实战》第一章分布式微服务架构设计原理...
  7. PID参数整定法(1)
  8. 雅思口语:填充词(句子)
  9. python中如何计算集合的长度_Python如何计算序列长度 python dataframe中元素如何统计?...
  10. 软件工程经济学结课报告——兰花智慧大棚监控系统可行性研究报告
  11. 直通输出设备 android kodi,分享RK3188芯片XBMC实现音频HDMI源码输出的方法
  12. Sloth演示程序及源代码发布
  13. no-sql数据库之redis
  14. 2023年湖北武汉中级工程师怎么申请?申报渠道有哪些?启程别
  15. 短视频脚本撰写小技巧,不同的短视频类型要使用不同的撰写方法
  16. 快递100 home.html代码
  17. STM32_基础入门_新建工程文件—基于固件库
  18. 读书笔记之《安全边际(中文完整版)》
  19. [leetCode]327. 区间和的个数
  20. 初链-解读初链白皮书

热门文章

  1. Windows下安装hadoop2.7.1
  2. 使用 Flink Hudi 构建流式数据湖平台
  3. Flink Forward Asia 2021 延期,线上相见
  4. 仿百篮应用市场(已开源)
  5. 计算机应用软件专家证,计算机应用软件项目验收报告专家
  6. 乌班图服务器应用,Ubuntu下安装Apache
  7. php jwt使用案例,PHP JWT初识及其简单示例
  8. java http请求_零基础学Java,掌握Java基础难不难?
  9. php mysql 拖拉 报表_php+mysql 生成统计报表
  10. python怎么打出pi_随手写了段 Python,微信的地球居然转起来