0% found this document useful (0 votes)
11 views2 pages

DP

Uploaded by

n23dccn139
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views2 pages

DP

Uploaded by

n23dccn139
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 2

//number of diffenrent subsequence

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];
}

//number of y for x & y == x;


for (int mask = (1 << N) - 1 ; mask >= 0 ; mask--) {
dp2[mask][N - 1] = cnt[mask];
for (int i = N - 1 ; i >= 0 ; i--) {
if (i < N - 1)dp2[mask][i] = dp2[mask][i + 1];
if (!(mask & (1 << i)))dp2[mask][i] += dp2[mask | (1 << i)][i == N - 1 ? i : i + 1];
}
//sos2[mask] = dp2[mask][0];
}

// 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;
}
}
}

//check if s1 and s2 are subsequence of s and not intersect


bool check(string &a,string &b,vector<vector<int>>&nxt){
int f=a.size(),g=b.size();
a=' '+a;
b=' '+b;
vector<vector<int>>dp(f+1,vector<int>(g+1,1e9));
dp[0][0]=0;
for(int i=0;i<=f;i++){
for(int j=0;j<=g;j++){
if(dp[i][j]==1e9)continue;
int len=dp[i][j];
if(i+1<=f&&nxt[len+1][a[i+1]-'a']<=n)dp[i+1][j]=min(dp[i+1][j],nxt[len+1][a[i+1]-'a']);
if(j+1<=g&&nxt[len+1][b[j+1]-'a']<=n)dp[i][j+1]=min(dp[i][j+1],nxt[len+1][b[j+1]-'a']);
}
}
return dp[f][g]<=n;
}

You might also like