当前位置: 首页 > 编程日记 > 正文

BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )

全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries + BIT 就行了.时间复杂度O(N log N). 速度垫底了QAQ 你们都会SAM。。。。

----------------------------------------------------------------------

#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
 

#define b(i) (1 << (i))

const int maxL = 540009;
const int maxQ = 60009;
char S[maxL], str[maxL];
int N, n, q, Id[maxL], qL[maxQ], qR[maxQ], L[maxQ], R[maxQ];
int Rank[maxL], Height[maxL], Sa[maxL], cnt[maxL];
int RMQ[20][maxL], r[maxQ], ans[maxQ];
void Build() {
int m = 'z' + 1, *x = Rank, *y = Height;
for(int i = 0; i < m; i++) cnt[i] = 0;
for(int i = 0; i < N; i++) cnt[x[i] = S[i]]++;
for(int i = 1; i < m; i++) cnt[i] += cnt[i - 1];
for(int i = N; i--; ) Sa[--cnt[x[i]]] = i;
for(int k = 1, p = 0; k <= N; k <<= 1, p = 0) {
for(int i = N - k; i < N; i++) y[p++] = i;
for(int i = 0; i < N; i++)
if(Sa[i] >= k) y[p++] = Sa[i] - k;
for(int i = 0; i < m; i++) cnt[i] = 0;
for(int i = 0; i < N; i++) cnt[x[y[i]]]++;
for(int i = 1; i < m; i++) cnt[i] += cnt[i - 1];
for(int i = N; i--; ) Sa[--cnt[x[y[i]]]] = y[i];
swap(x, y);
x[Sa[0]] = 0;
p = 1;
for(int i = 1; i < N; i++) {
if(y[Sa[i]] != y[Sa[i - 1]] || y[Sa[i] + k] != y[Sa[i - 1] + k]) p++;
x[Sa[i]] = p - 1;
}
if((m = p) >= N) break;
}
for(int i = 0; i < N; i++) Rank[Sa[i]] = i;
Height[0] = Height[N] = 0;
for(int i = 0, h = 0; i < N; i++) if(Rank[i]) {
if(h) h--;
while(S[i + h] == S[Sa[Rank[i] - 1] + h]) h++;
Height[Rank[i]] = h;
}
}
void Init_RMQ() {
for(int i = 0; i < N; i++)
RMQ[0][i] = Height[i];
for(int i = 1; b(i) <= N; i++)
for(int j = 0; j + b(i) <= N; j++)
RMQ[i][j] = min(RMQ[i - 1][j], RMQ[i - 1][j + b(i - 1)]);
}
inline int LCP(int l, int r) {
int t = log2(r - l + 1);
return min(RMQ[t][l], RMQ[t][r - b(t) + 1]);
}
void calc(int &L, int &R, int p, int len) {
int _l, _r;
p = Rank[p];
if(Height[p] >= len) {
_l = 0, _r = p - 1;
while(_l <= _r) {
int m = (_l + _r) >> 1;
if(LCP(m + 1, p) >= len)
L = m, _r = m - 1;
else
_l = m + 1;
}
} else
L = p;
if(Height[p + 1] >= len) {
_l = p + 1, _r = N - 1;
while(_l <= _r) {
int m = (_l + _r) >> 1;
if(LCP(p + 1, m) >= len)
R = m, _l = m + 1;
else
_r = m - 1;
}
} else
R = p;
}
struct Link {
int p;
Link* n;
} pool[maxL], *pt = pool, *H[maxL];
inline void AddL(int v, int p) {
pt->p = p, pt->n = H[v], H[v] = pt++;
}
int B[maxL];
inline void Modify(int p, int v) {
if(!p) return;
for(; p <= N; p += p & -p) B[p] += v;
}
inline int Sum(int p) {
int ret = 0;
for(; p; p -= p & -p) ret += B[p];
return ret;
}
inline bool Cmp(const int &l, const int &r) {
return qL[l] < qL[r];
}
void Work() {
Build();
Init_RMQ();
memset(B, 0, sizeof B);
for(int i = N; i--; )
if(Id[Sa[i]] >= 0) AddL(Id[Sa[i]], i);
for(int i = 0; i < n; i++)
Modify(H[i]->p + 1, 1);
for(int i = 0; i < q; i++)
calc(qL[r[i] = i], qR[i], L[i], R[i] - L[i]);
sort(r, r + q, Cmp);
int c = 0;
for(int i = 0; i < N; i++) {
while(qL[r[c]] == i) {
ans[r[c]] = Sum(qR[r[c]] + 1) - Sum(qL[r[c]]);
if(++c >= q) break;
}
if(c >= q) break;
Modify(i + 1, -1);
if(H[Id[Sa[i]]]) {
H[Id[Sa[i]]] = H[Id[Sa[i]]]->n;
if(H[Id[Sa[i]]])
Modify(H[Id[Sa[i]]]->p + 1, 1);
}
}
for(int i = 0; i < q; i++)
printf("%d\n", ans[i]);
}
inline int getstr() {
char c = getchar();
for(; !islower(c); c = getchar());
int len = 0;
for(; islower(c); c = getchar())
str[len++] = c;
return len;
}
void Init() {
scanf("%d%d", &n, &q);
N = 0;
int len;
for(int i = 0; i < n; i++) {
len = getstr();
for(int j = 0; j < len; j++) {
Id[N] = i;
S[N++] = str[j];
}
Id[N] = -1;
S[N++] = '$';
}
for(int i = 0; i < q; i++) {
len = getstr();
L[i] = N;
for(int j = 0; j < len; j++) {
Id[N] = -1;
S[N++] = str[j];
}
R[i] = N;
Id[N] = -1;
S[N++] = '$';
}
S[N - 1] = 0;
}
int main() {
Init();
Work();
return 0;
}

----------------------------------------------------------------------

2780: [Spoj]8093 Sevenk Love Oimaster

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 581  Solved: 188
[Submit][Status][Discuss]

Description

    Oimaster and sevenk love each other.

    But recently,sevenk heard that a girl named ChuYuXun was dating with oimaster.As a woman's nature, sevenk felt angry and began to check oimaster's online talk with ChuYuXun.    Oimaster talked with ChuYuXun n times, and each online talk actually is a string.Sevenk asks q questions like this,    "how many strings in oimaster's online talk contain this string as their substrings?"

Input


There are two integers in the first line,
the number of strings n and the number of questions q.
And n lines follow, each of them is a string describing oimaster's online talk.
And q lines follow, each of them is a question.
n<=10000, q<=60000 
the total length of n strings<=100000, 
the total length of q question strings<=360000

Output

For each question, output the answer in one line.

Sample Input

3 3
abcabcabc
aaa
aafe
abc
a
ca

Sample Output

1
3
1

HINT

Source

转载于:https://www.cnblogs.com/JSZX11556/p/5188453.html

相关文章:

centos7下Gitlab+Jenkins部署持续集成CI环境

1.基本环境 主机&#xff1a;win10&#xff0c;IP&#xff1a;192.168.0.111&#xff1b;部署机器centos7&#xff0c;IP&#xff1a;192.168.0.65&#xff1b;内存推荐到8G&#xff0c;实测需要6G以上&#xff0c;以免出现内存不够用而报错。 2.安装gitlab需要的组件 [rootloc…

VIM7.3添加中文帮助文档

安装中文帮助文档之前首先执行下列操作&#xff1a;在home目录下列新建文件夹 &#xff1a;.vim ------------------>.vim是一个隐藏文件&#xff0c;不要漏了 “.”.vim/plugin ---------->.vim目录下的plugin文件夹.vim/doc ------------->.vim目录下的doc文件夹.v…

安卓java代码标签_Android实现动态添加标签及其点击事件

在做Android开发的时候&#xff0c;会遇到动态添加标签让用户选择的功能&#xff0c;所以自己写了个例子&#xff0c;运行效果图如下。标签可以左右滑动进行选择&#xff0c;点击的时候&#xff0c;会弹出toast提示选择或者取消选择了哪个标签。通过动态添加TextView作为标签&a…

Windows 7 SDK Fails to Install with Return Code 5100 (GRMSDK_EN_DVD.iso)

来源&#xff1a;http://support.microsoft.com/kb/2717426/de 不对全文做翻译了&#xff0c;总结一下&#xff1a; 原因&#xff1a;电脑上已经安装了新版本的Visual C 2010 Redistributable运行库 解决办法&#xff1a;卸载Visual C 2010 Redistributable&#xff0c;然后再安…

Android动画效果translate、scale、alpha、rotate详解

动画类型Android的animation由四种类型组成XML中 alpha渐变透明度动画效果scale渐变尺寸伸缩动画效果translate画面转换位置移动动画效果rotate画面转移旋转动画效果JavaCode中 AlphaAnimation渐变透明度动画效果ScaleAnimation渐变尺寸伸缩动画效果TranslateAnimation画面转换…

对javscript中Object.defineProperty的理解

自己在使用vue的过程中经常会用到听到数据双向绑定这个词&#xff0c;而且我们还可以直接通过调用this.msg(this表示vue实例),来获取data上的数据&#xff0c;以前一直不太明白为什么可以这样获取&#xff0c;直到有一天我在论坛里看到了寻找海蓝96这位大佬写的文章,才明白其原…

java kafka 集群消费_kafka集群搭建和使用Java写kafka生产者消费者

转自&#xff1a;http://chengjianxiaoxue.iteye.com/blog/21904881 kafka集群搭建1.zookeeper集群 搭建在110&#xff0c; 111,1122.kafka使用3个节点110&#xff0c; 111,112修改配置文件config/server.propertiesbroker.id110host.name192.168.1.110log.dirs/usr/local/kafk…

Java之替换“\n”符号

开发平台&#xff1a;Android 4.1.2 在去除字符串中的换行符(\n)的时候&#xff0c;写成str.replace("\\n", "")才能正确执行。str.replace("\n","") &#xff0c;str.replaceAll("\\n","")&#xff0c;str.repla…

ThinkPHP项目笔记之登录,注册,安全退出篇

1.先说注册 a.准备好注册页面&#xff0c;register.html,当然一般有&#xff0c;姓名&#xff0c;邮箱&#xff0c;地址等常用的。 b."不要相信用户提交的一切数据",安全&#xff0c;安全是第一位的。所以要做判断&#xff0c;客户端要做基本判断&#xff0c;为了防止…

c语言第八次作业

1.选择法排序。输入一个正整数n(1<n<10)&#xff0c;再输入n个整数&#xff0c;将他们从大到小排序后输出。试写出相应程序。 #include<stdio.h>int main (void){int i,index,k,n,t;int a[10];printf("输入数据的个数n:");scanf("%d",&n);…

java线程池的工作原理_Java 线程池的介绍以及工作原理

在什么情况下使用线程池&#xff1f;1.单个任务处理的时间比较短2.将需处理的任务的数量大使用线程池的好处:1. 降低资源消耗&#xff1a;      通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2. 提高响应速度&#xff1a;      当任务到达时&#xff0c…

.NET 程序设计实验 含记事本通讯录代码

实验一 .NET 程序设计基本流程 【实验内容】 一、控制台、Windows 应用程序、ASP.NET 程序开发流程 1、熟悉开发平台 2、分别开发控制台、Windows 应用程序、ASP.NET 程序下显示“Hello world&#xff01;”的应用程序&#xff0c; 掌握新建、基本输入输出、程序流程、程序调试…

复制构造函数(拷贝构造函数)

也许很多C的初学者都知道什么是构造函数&#xff0c;但是对复制构造函数&#xff08;copy constructor&#xff09;却还很陌生。对于我来说&#xff0c;在写代码的时候能用得上复制构造函数的机会并不多&#xff0c;不过这并不说明复制构造函数没什么用&#xff0c;其实复制构造…

VMware上实现LVS负载均衡(NAT)

本文LVS的实现方式採用NAT模式。关于NAT的拓扑图请參照我的上一篇文章。本文纯粹实验。NAT在生产环境中不推荐使用。原因是Load Balancereasy成为瓶颈&#xff01; 1.VMware9上安装CentOS-6.5-x86_64-minimal版 2.安装完毕后将其hostname设置为LVS-master hostname LVS-master …

java se13安装教程_在Linux发行版中安装Java 13/OpenJDK 13的方法

本文介绍在Linux发行版Ubuntu 18.04/16.04、Debian 10/9、CentOS 7/8、Fedora 31/30/29中安装Java 13/OpenJDK 13、Java SE Development Kit 13的方法。在Ubuntu 18.04/16.04、Debian 10/9、CentOS 7/8、Fedora 31/30/29中安装OpenJDK 13访问JDK 13版本页面以下载最新的版本&am…

Java api 入门教程 之 JAVA的IO处理

IO是输入和输出的简称&#xff0c;在实际的使用时&#xff0c;输入和输出是有方向的。就像现实中两个人之间借钱一样&#xff0c;例如A借钱给B&#xff0c;相对于A来说是借出&#xff0c;而相对于B来说则是借入。所以在程序中提到输入和输出时&#xff0c;也需要区分清楚是相对…

如何编辑PDF文件,PDF编辑器如何使用

如何编辑PDF呢&#xff1f;其实大多数人都不知道该如何下手&#xff0c;部分人会选择将PDF文件转换成Word然后进行编辑&#xff0c;其实这种方法比较麻烦&#xff0c;大大拉低了我们的工作效率。如果想要提高工作效率更加快速的编辑PDF文件&#xff0c;就可以选择迅捷PDF编辑器…

hdu 4366 Card Collector (容斥原理)

http://acm.hdu.edu.cn/showproblem.php?pid4336题意&#xff1a;有 n 张卡片 &#xff0c;每张卡片出现的 概率 是 pi 每包至多有 一张卡片 &#xff0c;也有可能没有 卡片 。求 需要买多少包 才能集齐 n 张卡片 &#xff0c;求包数的 期望 。题解 &#xff1a; 容斥原理…

java语言二维数组转置_java实现二维数组转置的方法示例

本文实例讲述了java实现二维数组转置的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这里在文件中创建Test2、Exchange、Out三个类在Exchange类中编写exchange()方法&#xff0c;在方法中创建两个数组arraryA、arraryB&#xff0c;arraryB[j][i]arraryA[i][j]实…

使用Apache cxf 和Spring在Tomcat下发布Webservice指南

转载 http://blog.csdn.net/zhangzhaokun/article/details/4750021 最近学习了如何使用apache cxf和Spring发布webservice&#xff0c;虽然网上的资料很多&#xff0c;但是没有一个文档可以让读者按照操作步骤来实现完整的发布流程&#xff0c;都需要多篇文件杂合在一起&#x…

srcache_nginx redis 构建缓存系统应用一例

为什么80%的码农都做不了架构师&#xff1f;>>> srcache_nginx模块相关参数介绍&#xff0c;可以参见 《memc_nginxsrcache_nginxmemcached构建透明的动态页面缓存》。 redis是一种高效的key-value存储。 下面举一例应用&#xff0c;看配置&#xff1a; upstream r…

mysql 删除 修改密码_Mysql数据库root密码忘记了,如何在不删除Mysql的情况下修改密码...

1.cmd中使用 net stop mysql 命令停掉正在运行的mysql 数据库。2.在本地中复制Mysql数据库的安装路径一直到bin路径下。3.到cmd执行 "pushd 步骤2复制路径" 的命令&#xff0c;就会到Mysql数据库安装的bin路径下。4.紧接著执行 mysqld --skip-grant-tables 命令…

通用权限管理系统组件 (GPM - General Permissions Manager) 权限管理以前我们都是自己开发,可是到下一个系统又不适用,又改,加上人员流动大,管理很混乱...

为什么80%的码农都做不了架构师&#xff1f;>>> 权限管理以前我们都是自己开发&#xff0c;可是到下一个系统又不适用&#xff0c;又改&#xff0c;加上人员流动大&#xff0c;管理很混乱 Ψ吉日嘎拉 采用通用权限管理系统&#xff0c;这些烦恼就少了很多了&#x…

【小白的CFD之旅】16 流程

那天听了小牛师兄关于CFD应用的四种境界的说法后&#xff0c;小白发现自己连第一种境界都算不上&#xff0c;自己对于CFD还只是停留在做了少数几个案例的基础上&#xff0c;可以说是对其一无所知。不过小白不是那种遇到挫折就退缩的人&#xff0c;他决定沿着黄师姐的方法从软件…

XWiki 4.3 正式版发布

XWiki 4.3 正式版发布了&#xff0c;工作空间、扩展管理器、分发向导和 REST API 做了很多改进&#xff0c;改进了翻译和新的体验的 Solr 搜索。 XWiki是一个由Java编写的基于LGPL协议发布的开源wiki和应用平台。它的开发平台特性允许创建协作式Web应用&#xff0c;同时也提供了…

新建异常并处理java_java – 动态创建异常的工厂模式

我创建了Exception xml并动态创建并抛出异常.com.package.CheckedExceptionChecked Exception Messagecom.package.UnCheckedExceptionUnChecked Exception Message我根据异常键使用反射动态创建异常对象.public static void throwException(final String key) throws CheckedE…

React navtive

http://www.linuxidc.com/Linux/2015-09/123239.htm 转载于:https://www.cnblogs.com/chenzhenfj/p/5203685.html

c# Pdf 转换图片

1&#xff0c;引入 dll itextsharp.dll、 PDFView.dll、 把 gsdll32.dll 拷贝在项目 bin目录下 &#xff0c;注意&#xff1a;它不能 直接引用 直接上代码&#xff1a; 1 /// <summary>2 /// 将PDF 相应的页转换为图片3 /// </summary>4 …

Entity Framework 约定

约定&#xff0c;类似于接口&#xff0c;是一个规范和规则&#xff0c;使用Code First 定义约定来配置模型和规则。在这里约定只是记本规则&#xff0c;我们可以通过Data Annotaion或者Fluent API来进一步配置模型。约定的形式有如下几种&#xff1a; 类型发现约定主键约定关系…

java用构造方法定义book类_JAVA基础学习之路(三)类定义及构造方法

类的定义及使用一&#xff0c;类的定义classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intnum) {//定义一个方法return price*num;}}public classtest2 {public static voidmain(String args[]) {Book monney newBook();//声明…