后缀数组

先开始nc了,觉得自动机做法是指数级的,就写了个后缀数组

具体方法是暴力,枚举起点,然后用lcp向后暴力匹配,如果失配就减少一次,我们一共有3次机会,这样每次匹配复杂度是O(1)的,所以总复杂度是O(nlogn+n),然后t掉了,交了发别人代码,bzoj怎么那么慢,洛谷跑的飞快。调了很长时间发现sa板子写错了,明明是粘过来的。。。

后缀自动机就是在自动机上匹配,如果不匹配可以随便走,每次匹配完统计就行了

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + ;
int n, m, k, len, pos, ans;
char s[N], t[N];
int p[N], a[N], b[N], rank[N], lcp[N], sa[N], mn[N][], mp[], Log[N], tmp[N];
void radix(int *s, int *a, int *b, int n, int m)
{
int count[N]; memset(count, , sizeof(count));
for(int i = ; i <= n; ++i) ++count[s[a[i]]];
for(int i = ; i <= m; ++i) count[i] += count[i - ];
for(int i = n; i; --i) b[count[s[a[i]]]--] = a[i];
}
void Sa(int *s, int n)
{
for(int i = ; i <= n; ++i) rank[i] = i;
radix(s, rank, sa, n, );
rank[sa[]] = ;
for(int i = ; i <= n; ++i) rank[sa[i]] = rank[sa[i - ]] + (s[sa[i]] != s[sa[i - ]]);
for(int k = ; k <= n; k <<= )
{
for(int i = ; i <= n; ++i)
{
a[i] = rank[i];
b[i] = i + k <= n ? rank[i + k] : ;
sa[i] = i;
}
radix(b, sa, rank, n, n);
radix(a, rank, sa, n, n);
rank[sa[]] = ;
for(int i = ; i <= n; ++i) rank[sa[i]] = rank[sa[i - ]] + (a[sa[i]] != a[sa[i - ]] || b[sa[i]] != b[sa[i - ]]);
}
}
void Lcp(int *s, int n)
{
int h = ;
for(int i = ; i <= n; ++i) rank[sa[i]] = i;
for(int i = ; i <= n; ++i)
{
int j = sa[rank[i] - ];
if(rank[i] <= ) continue;
if(h > ) --h;
for(; i + h <= n && j + h <= n; ++h) if(s[i + h] != s[j + h]) break;
mn[rank[i] - ][] = h;
}
for(int j = ; j <= ; ++j)
for(int i = ; i + ( << j) - <= n; ++i)
mn[i][j] = min(mn[i][j - ], mn[i + ( << (j - ))][j - ]);
}
int query(int l, int r)
{
l = rank[l];
r = rank[r];
if(l > r) swap(l, r);
--r;
int x = Log[r - l + ];
return min(mn[l][x], mn[r - ( << x) + ][x]);
}
int main()
{
int T;
scanf("%d", &T);
mp['A'] = ;
mp['G'] = ;
mp['C'] = ;
mp['T'] = ;
for(int i = ; i < N; ++i) Log[i] = Log[i >> ] + ;
while(T--)
{
ans = ;
scanf("%s%s", s + , t + );
len = ;
n = strlen(s + );
m = strlen(t + );
for(int i = ; i <= n; ++i) p[++len] = mp[s[i]];
p[++len] = ;
pos = len + ;
for(int i = ; i <= m; ++i) p[++len] = mp[t[i]];
Sa(p, len);
Lcp(p, len);
for(int i = ; i <= n - m + ; ++i)
{
int tmp = m, cnt = , p1 = i, p2 = pos;
while(tmp > )
{
int x = query(p1, p2);
tmp -= x;
p1 += x;
p2 += x;
if(tmp <= ) break;
while(cnt >= && p[p1] != p[p2] && p1 <= n && p2 <= len)
{
++p1;
++p2;
--tmp;
--cnt;
}
if(cnt < || p2 > len || p1 > n) break;
}
if(cnt >= && tmp <= ) ++ans;
}
printf("%d\n", ans);
}
return ;
}

bzoj4892的更多相关文章

  1. bzoj4892 [TJOI2017]DNA

    bzoj4892 [TJOI2017]DNA 给定一个匹配串和一个模式串,求模式串有多少个连续子串能够修改不超过 \(3\) 个字符变成匹配串 \(len\leq10^5\) hash 枚举子串左端点 ...

  2. BZOJ4892 Tjoi2017dna(后缀数组)

    对每个子串暴力匹配至失配三次即可.可以用SA查lcp.然而在bzoj上被卡常了.当然也可以二分+哈希或者SAM甚至FFT. #include<iostream> #include<c ...

  3. 【BZOJ4892】DNA(后缀数组)

    [BZOJ4892]DNA(后缀数组) 题面 BZOJ 洛谷 题解 看到这道题目,我第一反应是\(FFT\)??? 然后大力码出了一个\(FFT\) 就像这样 #include<iostream ...

  4. BZOJ4892:[TJOI2017]dna(hash)

    Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够表 ...

  5. [BZOJ4892][TJOI2017]DNA(后缀数组)

    题目描述 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够表现出吃藕的性状 ...

  6. 字符串Hash/树Hash学习笔记

    哈希 Tags:字符串 作业部落 评论地址 一.概述 百度百科: 散列表(Hash table/哈希表),是根据关键码值(Key value)而直接进行访问的数据结构. 哈希表常用于比较两个字符串是否 ...

  7. FFT_应用和例题

    卷积 现有两个定义在 N 上的函数 \(f(n),g(n)\),定义 \(f\) 和 \(g\) 的卷积(convolution)为 \(f \otimes g\) \[ (f \otimes g)( ...

随机推荐

  1. android-BroadcastReceive广播接收器

    应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应.广播接收器没有用户界面.然而,它们可以启动一个activity或service来响应它们 ...

  2. (updated on Mar 1th)Programming Mobile Applications for Android Handheld Systems by Dr. Adam Porter

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. Lab - Inte ...

  3. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  4. Selenium + Nightwatch 自动化测试环境搭建

    首先要安装 Java 7 或更高 ,(http://www.oracle.com/technetwork/java/javase/downloads/index.html) 并且 java 命令可正常 ...

  5. Use the command of tar to multi-part archive method.

    We usually meet the package too large to upload internat space when upload have a limited .So we nee ...

  6. final 和static

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

  7. ECharts整合HT&#160;for&#160;Web的网络拓扑图应用

    ECharts图形组件在1.0公布的时候我就已经有所关注.今天在做项目的时候遇到了图标的需求,在HTfor Web上也有图形组件的功能.可是在尝试了下详细实现后,发现HT for Web的图形组件是以 ...

  8. iOS之简单瀑布流的实现

    iOS之简单瀑布流的实现   前言 超简单的瀑布流实现,这里说一下笔者的思路,详细代码在这里. 实现思路 collectionView能实现各中吊炸天的布局,其精髓就在于UICollectionVie ...

  9. Erlang function guards NOTE

    Note: I've compared , and ; in guards to the operators andalso and orelse. They're not exactly the s ...

  10. 九度OJ 1133:学分绩点 (加权平均数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1333 解决:702 题目描述: 北京大学对本科生的成绩施行平均学分绩点制(GPA).既将学生的实际考分根据不同的学科的不同学分按一定的公式 ...