Loi Online Judge 42. 「Loi57 test 2017.4.22」字符串

来源:互联网 发布:什么叫顶级域名 编辑:程序博客网 时间:2024/06/07 05:32

题目描述

给定n个串,m次询问,每次询问两个串的lcp(最长公共前缀)

输入格式

第一行包含两个数n,m,表示n个串,m次询问。

接下来n行,每行一个串。

再接下来m行,每行两个整数a,b,表示询问编号为ab的两个串的lcp

输出格式

输出包含m行,即为询问的答案

样例一

input

5 3exceptexpertexpectexampleexam1 22 34 5

output

244

限制与约定

对于30%的数据,m103,每个串的长度 103;

对于100%的数据,n103,m105,每个串的长度 104.

时间限制:1s

空间限制:512MB

思路
裸哈希+二分答案
预处理每个字符串的每前i位的哈希值;
二分答案,若前i位哈希值一样,则调高答案;否则调低;

注意
strlen的时间复杂度是O(n),所以要预处理,O(1)调用,否则会超时;

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>char c[1005][10005];const unsigned long long  P=29;unsigned long long  hs[1005][10005],len[1005];int a,b,n,m;using namespace std;int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++){        scanf("%s",c[i]);        len[i]=strlen(c[i]);        for(int j=0;j<len[i];j++){            hs[i][j+1]=hs[i][j]*P+(c[i][j]-'a'+1);        }    }    for(int j=1;j<=m;j++){        scanf("%d%d",&a,&b);        int l=0;        int r=min(len[a],len[b])+1;        while(r-l>1){            int mid=(r+l)/2;            if(hs[a][mid]==hs[b][mid]) l=mid;                else r=mid;            }        printf("%d\n",l);    }    return 0;}
0 0
原创粉丝点击