UVA 12238 Anti-Rhyme Pairs(hash+二分)

来源:互联网 发布:在线视频转码 知乎 编辑:程序博客网 时间:2024/06/12 20:04

题意:Anti-Rhyme Pairs

分析:将每个串hash直接二分长度即可

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<set>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )const int INF=0x3f3f3f3f;typedef long long LL;const int maxn=1e5+100;const int mod=1e9+7;const int p=1e6+7;vector<int>v[maxn];char str[maxn];int dp_min[maxn][20],a[maxn];int t,n,m,l,r,st,ed;void Hash(int x){    int len=strlen(str);    LL ans=0;    a[x]=len;    for(int i=0;i<len;i++)    {        ans=(ans*1LL*p+str[i])%mod;        v[x].push_back(ans);    }}bool ok(int x){    if(x<0) return true;    if(v[st][x]!=v[ed][x]) return false;    return true;}int main(){    int cas=1;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        getchar();        REPF(i,1,n)        {            v[i].clear();            gets(str);            Hash(i);        }        scanf("%d",&m);        printf("Case %d:\n",cas++);        while(m--)        {            scanf("%d%d",&st,&ed);            l=0,r=min(a[st],a[ed]);            int ans;            while(l<=r)            {                int mid=(l+r)>>1;                if(ok(mid-1))                {                    ans=mid;                    l=mid+1;                }                else                    r=mid-1;            }            printf("%d\n",ans);        }    }    return 0;}



0 0
原创粉丝点击