宜中資訊
CP
Ccucumber12
2021.08.24
Better?
struct node {
int count ;
node *nxt[26] ;
};
struct node {
int cnt ;
node *nxt[26] ;
node () {
cnt = 0 ;
for(int i=0; i<26; ++i)
nxt[i] = nullptr ;
}
} ;
node *root = new node() ;
void modify(string s, int val) {
node *tmp = root ;
for(auto i:s) {
i -= 'a' ;
if(tmp -> nxt[i] == nullptr)
tmp -> nxt[i] = new node() ;
tmp = tmp -> nxt[i] ;
}
tmp -> cnt += val ;
}
int count(string s) {
node *tmp = root ;
for(auto i:s) {
i -= 'a' ;
if(tmp -> nxt[i] == nullptr)
return 0 ;
tmp = tmp -> nxt[i] ;
}
return tmp -> cnt ;
}
a | b | a | b | b | a | a | b | a | b | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
-1 | -1 | 0 | 1 | -1 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 1 | 2 | 0 |
void build(string s) {
f[0] = -1 ;
for(int i=1; i<s.size(); ++i) {
f[i] = f[i-1] ;
while(f[i] > -1 && s[i] != s[f[i] + 1])
f[i] = f[f[i]] ;
f[i] += (s[i] == s[f[i] + 1]) ;
}
}
int kmp(string s, string t) {
int k = -1, ret = 0 ;
for(int i=0; i<t.size(); ++i) {
while(k > -1 && t[i] != s[k + 1])
k = f[k] ;
k += (t[i] == s[k + 1]) ;
if(k == s.size() - 1)
k = f[k], ++ret ;
}
return ret ;
}
a | b | a | b | b | a | a | b | a | b | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 2 | 0 | 0 | 1 | 6 | 0 | 2 | 0 | 0 | 3 | 0 | 1 | 1 |
WHY
@
)S @ T
@
卡住)模擬動畫
http://www.utdallas.edu/~besp/demo/John2010/z-algorithm.htm
vector<int> zAlgo(string s) {
int l = 0, r = 0;
vector<int> z(s.size()) ;
for(int i = 1, n = s.size(); i < n; ++i) {
if(i > r) {
l = r = i ;
while(r < n && s[r - l] == s[r])
r++ ;
z[i] = r - l ;
r-- ;
} else {
int k = i - l ;
if(z[k] < r - i + 1) z[i] = z[k] ;
else {
l = i ;
while(r < n && s[r - l] == s[r])
r++ ;
z[i] = r - l ;
r-- ;
}
}
}
return z ;
}
const int N = 500010 ;
const int M = 1e9 + 7 ;
const int b = 313 ;
long long hs[N];
void init(string s) {
int n = s.size();
bp[0] = 1 ;
for(int i=1; i<=n; ++i) {
hs[i] = (hs[i-1] * b + s[i-1]) % M ;
}
}
const int N = 500010 ;
const int M = 1e9 + 7 ;
const int b = 313 ;
long long hs[N], bp[N] ;
void init(string s) {
int n = s.size();
bp[0] = 1 ;
for(int i=1; i<=n; ++i) {
hs[i] = (hs[i-1] * b + s[i-1]) % M ;
bp[i] = bp[i-1] * b % M ;
}
}
long long query(int l, int r) {
return (hs[r+1] - hs[l] * bp[r-l+1] % M + M) % M ;
}
KMP or Z-Algorithm?
Best \(M\) and \(b\)?
https://codeforces.com/blog/entry/60445