运用了字符串哈希和拉链法实现的哈希
题目链接
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 2e3 + 10,P = 131,MOD = 10007;
typedef unsigned long long ULL;
ULL h[N], p[N];
char str[N];
int ans[N][N];
struct hashmap
{
int h[MOD+10], ne[N], idx;
unsigned long long st[N];
int f[N];
void init()
{
idx = 0;
memset(h, -1, sizeof(h));
}
int insert(unsigned long long val, int id)
{
int x =( val % MOD+MOD)%MOD;
for (int i = h[x]; ~i; i = ne[i])
{
if (val == st[i])
{
int temp = f[i];
f[i] = id;
return temp;
}
}
f[idx] = id;
st[idx] = val;
ne[idx] = h[x];
h[x] = idx++;
return 0;
}
} q;
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
p[0] = 1;
for (int i = 1; i <= N - 5; i++)
p[i] = p[i - 1] * P;
while (t--)
{
cin >> str + 1;
int n = strlen(str+1);
for (int i = 1; i <= n; i++)
h[i] = h[i - 1] *P + str[i];
memset(ans, 0, sizeof ans);
for (int i = 1; i <= n; i++)
{
//减少冲突
q.init();
for (int j = 1; j + i - 1 <= n; j++)
{
int l = q.insert(h[i + j - 1] - h[j - 1] * p[i], j);
ans[j][j + i - 1]++;
ans[l][j + i - 1]--;
}
}
for (int i = n; i; i--)
{
for (int j = i; j <= n; j++)
{
ans[i][j] += ans[i + 1][j] + ans[i][j - 1] - ans[i + 1][j - 1];
}
}
int k;
cin >> k;
while (k--)
{
int a, b;
cin >> a >> b;
printf("%d\n", ans[a][b]);
}
}
return 0;
}