BZOJ 2946 二分+Hash

原创 2018年04月17日 17:38:13

https://www.lydsy.com/JudgeOnline/problem.php?id=2946

给你五个串

问你最长公共子序列

网上其他博客都是什么后缀,什么自动机啦

太繁琐了

这题一看直接二分答案啊

代码优雅,思路清晰

(其实是因为我还不会后缀自动机(大雾)

AC代码:

#include<iostream>
#include<set>
using namespace std;
typedef unsigned long long ll;
const int N=2000;
ll n;
ll p[N+10];
string S[10];
ll f[10][N+10];
ll Hash(ll P,ll l,ll r){
    return f[P][r]-f[P][l-1]*p[r-l+1];
}
bool check(ll x){
	if(x==0) return 1;
    set<ll> A[10];
    for(ll i=1;i+x-1<=S[1].length();++i){
        A[1].insert(Hash(1,i,i+x-1));
    }
    if(A[1].size()==0)
        return 0;
    for(ll i=2;i<=n;++i){
        for(ll j=1;j+x-1<=S[i].length();++j){
            if(A[i-1].find(Hash(i,j,j+x-1))!=A[i-1].end())
                A[i].insert(Hash(i,j,j+x-1));
        }
        if(A[i].size()==0)
            return 0;
    }
    return 1;
}
int main(){
    cin>>n;
    for(ll i=1;i<=n;++i)
        cin>>S[i];
    p[0]=1;
    for(ll i=1;i<=N;++i)
        p[i]=p[i-1]*131;
    for(ll i=1;i<=n;++i){
        for(ll j=1;j<=S[i].length();++j){
            f[i][j]=f[i][j-1]*131+S[i][j-1]-'a'+1;
        }
    }
    ll l=0,r=2000;
    while(l<r){
        ll mid=(l+r+1)/2;
        if(check(mid))
            l=mid;
        else
            r=mid-1;
    }
    cout<<l<<endl;
}

bzoj2946公共串

题意:求n个字符串的最长公共子串。     我们先建出一个串的后缀自动机。 考虑后缀自动机的一个性质就是到当前状态s的所有路径都是互相包含的,这说明了什么呢?我们设Ans[i]是i状态目前能够匹配...
  • jzhang1
  • jzhang1
  • 2016-01-21 18:53:39
  • 291

【BZOJ 2946】【POI 2000】公共串【后缀数组】【裸】

Description给出几个由小写字母构成的单词,求它们最长的公共子串的长度。 任务: l 读入单词 l 计算最长公共子串的长度 l 输出结果Inp...
  • nixinyis
  • nixinyis
  • 2017-03-22 21:05:35
  • 147

【POI2000】【BZOJ2946】公共串

2946: [Poi2000]公共串 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 286 Solved: 121 [Submit][Stat...
  • CreationAugust
  • CreationAugust
  • 2015-07-26 17:07:26
  • 1172

[bzoj2946][后缀数组][Poi2000]公共串

2946: [Poi2000]公共串Time Limit: 3 Sec Memory Limit: 128 MB Submit: 1178 Solved: 527 [Submit][Statu...
  • qq_36993218
  • qq_36993218
  • 2017-07-21 17:26:04
  • 236

POJ 2946 字符串hash + BFS

题意就是给出一个地图。有一个起点,一个终点 我们要从起点到终点去。但是地上有毒液,不能走,不过有一些箱子可以供你跳来跳去。这些箱子的高度是2,3或者4 然后每次跳一步只能去4个方向相邻坐标的箱子。...
  • sdj222555
  • sdj222555
  • 2012-09-14 18:53:46
  • 1013

BZOJ 2946 [Poi2000]公共串 后缀数组

BZOJ 2946 [Poi2000]公共串 后缀数组
  • wzq_QwQ
  • wzq_QwQ
  • 2015-09-02 18:47:45
  • 1587

【BZOJ 2946】[Poi2000]公共串 后缀数组

Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度。 任务: l        读入单词 l        计算最长公共子串的长度 ...
  • pbihao
  • pbihao
  • 2016-12-13 16:13:42
  • 111

LA-4513 - Stammering Aliens-(hash字符串+二分答案+hash排序) 找出子串出现次数

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&categ...
  • viphong
  • viphong
  • 2015-10-05 18:09:51
  • 520

F 求最长公共字串 hash+二分

题目链接:http://acm.dlut.edu.cn/problem.php?id=1251 不知道这个链接其他人
  • u013307987
  • u013307987
  • 2014-04-24 11:26:40
  • 737

bzoj 1692 二分+hash

如果当前两边字符不同,那么选小的那边。否则二分+hash找到第一个不同的位置,如果左边小输左边,否则输右边。 逗比输出。。。#include using namespace std; #defin...
  • make_it_for_good
  • make_it_for_good
  • 2016-10-18 18:36:55
  • 257
收藏助手
不良信息举报
您举报文章:BZOJ 2946 二分+Hash
举报原因:
原因补充:

(最多只允许输入30个字)