HDU 4644 BWT(Burrows–Wheeler transform+KMP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4644
题意:给出一个串,按照下面的步骤得到一个新串:
(1)首先将其后面增加一个美元符号;
(2)将每个后缀写下,并将前面的补在后面;
(3)排序;
(4)取下最后一列,得到新串。
现在给出新串。再给出一些串,问这些串是不是原串的子串。
思路:首先,我们要做的就是还原原串。下面是题解给出的还原的方法:
乍看上去是O(n^2logn)的!!其实有O(n)还原的方法。不过也是借助于上面的思路。对于上面得到的串gc$aaac为例,首先,为其编号0到6,那么排序后得到为:$aaaccg,编号为2345160(记为W)。我们想一下,以后每次排序得到的W和现在的都是一样的。想想,若首字母不同则显然,小的字母以后还是在前面,比如$开始的这个串一直排名第一;对于相同的字母,比如3个a,那么越靠前的a其后面补的字母越小,还是越靠前。因此,排名第一的串的第一个字母为2=a[0]位置的$;而第一轮补给2位置的为4=a[2]位置的a,第二轮跑到了0位置的串即$的后面。依次类推即可。
之后对于每个查询就是KMP匹配即可。
char s[N],S[N];
int n,a[N];
int cmp(int x,int y)
{
if(s[x]==s[y]) return x<y;
return s[x]<s[y];
}
int next[N];
int cal()
{
next[0]=-1;
int i=0,j=-1;
int len=strlen(s);
while(i<len)
{
if(j==-1||s[i]==s[j]) i++,j++;
else j=next[j];
}
i=0,j=0;
while(i<n)
{
if(j==-1||S[i]==s[j]) i++,j++;
else j=next[j];
if(j==len) return 1;
}
return 0;
}
int main()
{
while(scanf("%s",s)!=-1)
{
n=strlen(s);
int i;
FOR0(i,n) a[i]=i;
sort(a,a+n,cmp);
int t=a[0];
FOR0(i,n)
{
S[i]=s[t];
t=a[t];
}
int m;
RD(m);
while(m--)
{
RD(s);
if(cal()) puts("YES");
else puts("NO");
}
}
}
HDU 4644 BWT(Burrows–Wheeler transform+KMP)的更多相关文章
- HDU 1686 Oulipo (可重叠匹配 KMP)
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 2087 剪花布条(字符串匹配,KMP)
HDU 2087 剪花布条(字符串匹配,KMP) Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出 ...
- HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)
HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP) Description The French author George ...
- HDU 6311 Cover (无向图最小路径覆盖)
HDU 6311 Cover (无向图最小路径覆盖) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU 4289 Control (网络流,最大流)
HDU 4289 Control (网络流,最大流) Description You, the head of Department of Security, recently received a ...
- HDU 4292 Food (网络流,最大流)
HDU 4292 Food (网络流,最大流) Description You, a part-time dining service worker in your college's dining ...
- HDU - 3613 Best Reward(manacher或拓展kmp)
传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...
- hdu 4289 Control(最小割 + 拆点)
http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others) Mem ...
- hdu 3308 LCIS(线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others) ...
随机推荐
- while小问题
while(!m_SMque.pop(data)); 看到这个有点忘了,如果pop返回false会一直执行pop,其实这个执行的是空语句,而while每次执行都需要判断条件,所以如果pop返回fals ...
- sencha Touch 2.4 学习之 XTemplate模板
XTemplate模板 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...
- PHP 路径或URL操作
echo 'documentroot:'.$_SERVER['DOCUMENT_ROOT'].'<br>'; //根目录,在apache的配置文件里定义:httpd.conf 比如:Doc ...
- poj 1185
上一题的升级版 dp[i][j][k] 表示第 i 行状态为 k 第i-1行状态为 j #include <cstdio> #include <cstdlib> #includ ...
- Yarn的服务库和事件库
对于生命周期较长的对象,YARN采用了基于服务对象管理模型对其进行管理. 该模型有一下特点: 每个被服务化的对象都分为4个状态 任何服务状态变化都可以触发另外一些动作 可以通过组合方式对任意服务进行组 ...
- Excel每隔两行自动求和一次怎么操作?
今天ytkah得到一份数据,要求进行统计分析,由于是原始数据,还没处理过,数据量有点大,如下图所示(Excel每隔两行自动求和),每天的数字由两项组成,男生的人数.消费值和女生的人数和消费值,数字都在 ...
- c#知识库同步的总结
C#知识库下载地址: http://www.51aspx.com/Code/FileCollector 新版下载地址:http://pan.baidu.com/s/1P3Hk 对于这一款平时用来收集知 ...
- 只 一行显示可左右滚动的文本(UITextField中文限制)
// // ViewController.m // 一行显示可滚动的文本 // // Created by apple on 15-5-8. // Copyright (c) 2015年 apple. ...
- bat批处理延迟运行脚本(zz)
@echo off:aaapause 这里是你需要运行的程序for /l %%i in (0,1,10000) do echo %%i>nulgoto aaa 当然bat延迟运行还有其他的一些方 ...
- POJ 3525 Most Distant Point from the Sea (半平面交向内推进+二分半径)
题目链接 题意 : 给你一个多边形,问你里边能够盛的下的最大的圆的半径是多少. 思路 :先二分半径r,半平面交向内推进r.模板题 #include <stdio.h> #include & ...