String
String
1-index chữ cái lần cuối xuất hiện trong trước khi đến chữ cái vị trí i
array<int, 26> last;
fill(last, last + 26, -1);
vector<int> prv(N + 1);
for (int i = 1; i <= N; ++i) {
prv[i] = last[S[i] - 'a'];
last[S[i] - 'a'] = i ;
}
KMP
vector<int> kmp(string s) {
int n = (int)s.length();
vector<int> pi(n);
for (int i = 1; i < n; i++) {
int j = pi[i - 1];
while (j > 0 && s[i] != s[j])
j = pi[j - 1];
if (s[i] == s[j])
j++;
pi[i] = j;
}
return pi;
}
Z-function
vector<int> z_function(string s) {
int n = s.length();
vector<int> z(n);
for (int i = 1, l = 0, r = 0; i < n; ++i) {
// khoi tao z[i] theo thuat toan toi uu
if (i <= r)
z[i] = min(r - i + 1, z[i - l]);
// tinh z[i]
while (i + z[i] < n && s[z[i]] == s[i + z[i]])
++z[i];
// cap nhat doan [l,r]
if (i + z[i] - 1 > r) {
l = i;
r = i + z[i] - 1;
}
}
return z;
}
TRIE
class Trie {
struct Node {
Node* child[26];
int exist;
int cnt;
public:
Trie() : root(new Node()) {}
private:
Node* root;
};
int main() {
string T, P;
cin >> T >> P;
ll hashP=0;
for (int i = 1; i <= lenP; i++)
hashP = (hashP * base + P[i] - 'a' + 1) % MOD;