社区讨论
字符串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 条回复,欢迎继续交流。
正在加载回复...