CFgym:Hidden Anagrams(Hash)

来源:互联网 发布:淘宝卖农产品要什么证 编辑:程序博客网 时间:2024/06/05 16:11

题意:给两个字符串S和T,长度<=4000,找出各自最长的连续子串,使得两个子串的组成字母和其数量完全相同(即两子串排序后完全一样),Timelimit:10s。

思路:暴力找出S所有子串的Hash值,扔进set,从大到小枚举长度,在T中找。

//reference: weareateam# include <bits/stdc++.h>using namespace std;typedef long long LL;typedef unsigned long long ull;char s[4008], t[4008];LL a[4008][28]={0}, b[4008][28]={0};int slen, tlen;int t1[4008], t2[4008];unordered_set<ull>S;bool check(int x){    for(int i=1; i+x-1<=tlen; ++i)    {        ull r = 2333;        for(int j=0; j<26; ++j) r += (r<<4)+b[i+x-1][j]-b[i-1][j];        if(S.count(r)) return true;    }    return false;}int main(){    scanf("%s%s",s+1,t+1);    slen = strlen(s+1);    tlen = strlen(t+1);    for(int i=1; i<=slen; ++i)    {        for(int j=0; j<26; ++j) a[i][j] = a[i-1][j];        ++a[i][s[i]-'a'];    }    for(int i=1; i<=tlen; ++i)    {        for(int j=0; j<26; ++j) b[i][j] = b[i-1][j];        ++b[i][t[i]-'a'];    }    for(int i=1; i<=slen; ++i)    {        for(int j=i; j<=slen; ++j)        {            ull r = 2333;            for(int k=0; k<26; ++k) r += (r<<4)+a[j][k]-a[i-1][k];            S.insert(r);        }    }    int ans = min(slen, tlen);    while(ans)    {        if(check(ans)) break;        --ans;    }    printf("%d\n",ans);    return 0;}


原创粉丝点击