#include <bits/stdc++.h>
using namespace std;
const int MAX_CHAR = 256;
// Returns count of distinct sunsequences of str.
int countSub(string str)
{
// Create an array to store index
// of last
vector<int> last(MAX_CHAR, -1);
// Length of input string
int n = str.length();
// dp[i] is going to store count of distinct
// subsequences of length i.
int dp[n+1];
// Empty substring has only one subsequence
dp[0] = 1;
// Traverse through all lengths from 1 to n.
for (int i=1; i<=n; i++)
{
// Number of subsequences with substring
// str[0..i-1]
dp[i] = 2*dp[i-1];
// If current character has appeared
// before, then remove all subsequences
// ending with previous occurrence.
if (last[str[i-1]] != -1)
dp[i] = dp[i] - dp[last[str[i-1]]];
// Mark occurrence of current character
last[str[i-1]] = (i-1);
}
return dp[n];
}
// Driver code
int main()
{
cout << countSub("gfgg");
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKY29uc3QgaW50IE1BWF9DSEFSID0gMjU2OyAKICAKLy8gUmV0dXJucyBjb3VudCBvZiBkaXN0aW5jdCBzdW5zZXF1ZW5jZXMgb2Ygc3RyLiAKaW50IGNvdW50U3ViKHN0cmluZyBzdHIpIAp7IAogICAgLy8gQ3JlYXRlIGFuIGFycmF5IHRvIHN0b3JlIGluZGV4IAogICAgLy8gb2YgbGFzdCAKICAgIHZlY3RvcjxpbnQ+IGxhc3QoTUFYX0NIQVIsIC0xKTsgCiAgCiAgICAvLyBMZW5ndGggb2YgaW5wdXQgc3RyaW5nIAogICAgaW50IG4gPSBzdHIubGVuZ3RoKCk7IAogIAogICAgLy8gZHBbaV0gaXMgZ29pbmcgdG8gc3RvcmUgY291bnQgb2YgZGlzdGluY3QgCiAgICAvLyBzdWJzZXF1ZW5jZXMgb2YgbGVuZ3RoIGkuIAogICAgaW50IGRwW24rMV07IAogIAogICAgLy8gRW1wdHkgc3Vic3RyaW5nIGhhcyBvbmx5IG9uZSBzdWJzZXF1ZW5jZSAKICAgIGRwWzBdID0gMTsgCiAgCiAgICAvLyBUcmF2ZXJzZSB0aHJvdWdoIGFsbCBsZW5ndGhzIGZyb20gMSB0byBuLiAKICAgIGZvciAoaW50IGk9MTsgaTw9bjsgaSsrKSAKICAgIHsgCiAgICAgICAgLy8gTnVtYmVyIG9mIHN1YnNlcXVlbmNlcyB3aXRoIHN1YnN0cmluZyAKICAgICAgICAvLyBzdHJbMC4uaS0xXSAKICAgICAgICBkcFtpXSA9IDIqZHBbaS0xXTsgCiAgCiAgICAgICAgLy8gSWYgY3VycmVudCBjaGFyYWN0ZXIgaGFzIGFwcGVhcmVkIAogICAgICAgIC8vIGJlZm9yZSwgdGhlbiByZW1vdmUgYWxsIHN1YnNlcXVlbmNlcyAKICAgICAgICAvLyBlbmRpbmcgd2l0aCBwcmV2aW91cyBvY2N1cnJlbmNlLiAKICAgICAgICBpZiAobGFzdFtzdHJbaS0xXV0gIT0gLTEpIAogICAgICAgICAgICBkcFtpXSA9IGRwW2ldIC0gZHBbbGFzdFtzdHJbaS0xXV1dOyAKICAKICAgICAgICAvLyBNYXJrIG9jY3VycmVuY2Ugb2YgY3VycmVudCBjaGFyYWN0ZXIgCiAgICAgICAgbGFzdFtzdHJbaS0xXV0gPSAoaS0xKTsgCiAgICB9IAogIAogICAgcmV0dXJuIGRwW25dOyAKfSAKICAKLy8gRHJpdmVyIGNvZGUgCmludCBtYWluKCkgCnsgCiAgIGNvdXQgPDwgY291bnRTdWIoImdmZ2ciKTsgCiAgIHJldHVybiAwOyAKfSA=