标签:思考 ++ def include 不能 去掉 不同 init ret
这其实是一道哈希模板题,题目定义“相似串”:两字符串只有一处不同。
很容易想到哈希,我们枚举每一位,将该位的哈希值删除后重新比较两串即可,主要实现也很简单,主要类比进制就好了。(\(ps\) :我再也不相信单模数哈希了),如何记录答案?肯定不能 \(n^2\) 记录啦,将去掉某位的哈希值排序,再顺着扫一遍即可,具体细节见代码
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll base = 131;
char s[30030][205];
ll S, ans, B[30030], H[30030][205], n, len, cnt, tmp[30030];
void init(){
B[0] = 1;
for(int i=1; i<=len; i++) B[i] = (B[i-1] * base);
for(int i=1; i<=n; i++){
for(int j=1; j<=len; j++){
H[i][j] = (H[i][j-1] * base + s[i][j]);
}
}
}
int main(){
cin >> n >> len >> S;
for(int i=1; i<=n; i++){
cin >> s[i] + 1;
}
init();
for(int j=1; j<=len; j++){
for(int i=1; i<=n; i++){
tmp[i] = H[i][j-1] * B[len-j] + H[i][len] - H[i][j] * B[len-j];
}
sort(tmp+1, tmp+n+1);
int sum = 1;
for(int i=1; i<=n; i++){
if(tmp[i] == tmp[i-1]) ans += sum, sum ++;
else sum = 1;
}
}
cout << ans;
return 0;
}
以后自然溢出/最好双哈希
标签:思考 ++ def include 不能 去掉 不同 init ret
原文地址:https://www.cnblogs.com/alecli/p/9906113.html