DP
DP
vector<vector<int>>last(n + 1,vector<int>(26));
for (int i = 1 ; i <= n ; i++) {
last[i] = last[i - 1];
last[i][s[i] - 'a'] = i;
}
vector<vector<ll>>dp(n + 1,vector<ll>(n + 1));
for (int i = 1 ; i <= n ; i++) {
dp[i][1] = 1;
}
for (int len = 2 ; len <= n ; len++) {
for (int i = len ; i <= n ; i++) {
for (int j = 0 ; j < 26 ; j++) {
dp[i][len] += dp[last[i - 1][j]][len - 1];
}
}
}
//dp sos
//number of y for x | y == x;
for (int mask = 0 ; mask < (1 << N) ; mask++) {
dp1[mask][0] = cnt[mask];
for (int i = 0 ; i < N ; i++) {
if (i)dp1[mask][i] = dp1[mask][i - 1];
if (mask & (1 << i))dp1[mask][i] += dp1[mask ^ (1 << i)][i ? i - 1 : 0];
}
//sos1[mask] = dp1[mask][N - 1];
}
// kmp with 1 index and jump array for next index for each alphabent
void calc(int n,string &s,vector<int>&kmp,vector<vector<int>>&nxt) {
kmp[1] = 0;
for (int j = 2 ; j <= n ; j++) {
int i = kmp[j - 1];
while (i > 0 && s[i + 1] != s[j]) {
i = kmp[i];
}
if (s[i + 1] == s[j])i++;
kmp[j] = i;
}
for (int i = 0 ; i <= n ; i++) {
for (int z = 0 ; z < 26 ; z++) {
int cur = i;
while (cur > 0 && s[cur + 1] != z + 'a') {
cur = kmp[cur];
}
if (s[cur + 1] == z + 'a')cur++;
nxt[i][z] = cur;
}
}
}