-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathADACLEAN - Ada and Spring Cleaning.cpp
70 lines (60 loc) · 1.46 KB
/
ADACLEAN - Ada and Spring Cleaning.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//https://www.spoj.com/problems/ADACLEAN/
// idea - double hash and store the value in set
#include<bits/stdc++.h>
using namespace std;
#define INF 1000000000
#define maxn 100005
#define ll long long
#define pii pair<ll, ll>
#define ft first
#define sd second
#define p1 31
#define p2 37
#define M1 1000000007
#define M2 1000000009
ll power(ll b, ll p, ll mod){
ll ret = 1;
while(p){
if(p%2)
ret = (ret*b)%mod;
b = (b*b)%mod;
p/=2;
}
return ret;
}
int main(){
int t;
cin >> t;
while(t--)
{
int n, k;
cin >> n >> k;
string s;
cin >> s;
set<pii> ss;
ll v1 = 0, v2 = 0, b1 = 1, b2 = 1;
for(int i = 0; i < k; i++)
{
v1 = (v1 + b1*s[i])%M1;
b1 = (b1*p1)%M1;
v2 = (v2 + b2*s[i])%M2;
b2 = (b2*p2)%M2;
}
ss.insert({v1, v2});
ll inv1 = power(p1, M1-2, M1);
ll inv2 = power(p2, M2-2, M2);
for(int i = k, j = 0; i < n; i++, j++)
{
v1 -= s[j];
if(v1 < 0) v1 += M1;
v1 = (v1 + b1*s[i])%M1;
v1 = (v1*inv1)%M1;
v2 -= s[j];
if(v2 < 0) v2 += M2;
v2 = (v2 + b2*s[i])%M2;
v2 = (v2*inv2)%M2;
ss.insert({v1, v2}); //cout << v1 << " " << v2 << endl;
}
cout << ss.size() << endl;
}
}