社区讨论

字符串hash求调

SP10570LONGCS - Longest Common Substring参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhju8x9a
此快照首次捕获于
2025/11/04 08:36
4 个月前
此快照最后确认于
2025/11/04 08:36
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

const int N = 1e4+10,P = 13331;
typedef unsigned long long ull;

int n;
ull p[N],h[N][6],len[6],minlen=N;

ull get_hash(int id,int l,int r)
{
    return h[r][id]-h[l-1][id]*p[r-l+1];
}

bool check(int mid)
{
    unordered_set<ull> st;
    for(int i=1;i+mid-1<=len[1];i++)
        st.insert(get_hash(1,i,i+mid-1));
    for(int k=2;k<=n;k++)
    {
        unordered_set<ull> cur;
        for(int i=1;i+mid-1<=len[k];i++)
        {
            ull x = get_hash(k,i,i+mid-1);
            if(st.count(x)) cur.insert(x);
        }
        if(cur.empty()) return false;
        st = cur;
    }
    return true;
}

void solve()
{
    memset(h,0,sizeof(h));
    memset(len,0,sizeof(len));
    minlen = N;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        string s;
        cin >> s;
        len[i] = s.length();
        minlen = min(minlen,len[i]);
        s = " "+s;
        for(int j=1;j<=len[i];j++)
            h[j][i] = h[j-1][i]*P+s[j];
    }
    int l=0,r=minlen,ans = 0;
    while(l<r)
    {
        int mid = l+r+1>>1;
        if(check(mid)) l = mid;
        else r = mid-1;
    }
    cout << l << endl;
}

int main()
{
    p[0] = 1;
    for(int i=1;i<N;i++) p[i] = p[i-1]*P;
    int t;
    cin >> t;
    while(t--)
        solve();
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...