class Solution {
public :
int m = 1e9 + 7 ;
typedef long long ll;
int dp[ 1010 ] [ 5 ] [ 2010 ] ;
ll solve( string& s, int i, int prev, int score) {
if ( i >= s.size ( ) ) {
if ( score > 0 ) {
return 1 ;
}
return 0 ;
}
if ( dp[ i] [ prev+ 1 ] [ score+ 1010 ] ! = - 1 ) return dp[ i] [ prev+ 1 ] [ score+ 1010 ] ;
ll ans = 0 ;
if ( s[ i] == 'E' ) {
if ( prev== - 1 ) {
ll op1 = solve( s, i+ 1 , 0 , score+ 1 ) ;
ll op2 = solve( s, i+ 1 , 1 , score- 1 ) ;
ll op3 = solve( s, i+ 1 , 2 , score) ;
ans= ( ans% m+ ( ( op1% m + op2% m) % m + op3% m) % m) % m;
}
else if ( prev == 0 ) {
ll op1 = solve( s, i+ 1 , 1 , score- 1 ) ;
ll op2 = solve( s, i+ 1 , 2 , score) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
else if ( prev== 1 ) {
ll op1 = solve( s, i+ 1 , 0 , score+ 1 ) ;
ll op2 = solve( s, i+ 1 , 2 , score) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
else {
ll op1 = solve( s, i+ 1 , 0 , score+ 1 ) ;
ll op2 = solve( s, i+ 1 , 1 , score- 1 ) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
}
else if ( s[ i] == 'F' ) {
if ( prev== - 1 ) {
ll op1 = solve( s, i+ 1 , 0 , score) ;
ll op2 = solve( s, i+ 1 , 1 , score+ 1 ) ;
ll op3 = solve( s, i+ 1 , 2 , score- 1 ) ;
ans= ( ans% m+ ( ( op1% m + op2% m) % m + op3% m) % m) % m;
}
else if ( prev == 0 ) {
ll op1 = solve( s, i+ 1 , 1 , score+ 1 ) ;
ll op2 = solve( s, i+ 1 , 2 , score- 1 ) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
else if ( prev== 1 ) {
ll op1 = solve( s, i+ 1 , 0 , score) ;
ll op2 = solve( s, i+ 1 , 2 , score- 1 ) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
else {
ll op1 = solve( s, i+ 1 , 0 , score) ;
ll op2 = solve( s, i+ 1 , 1 , score+ 1 ) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
}
else {
if ( prev== - 1 ) {
ll op1 = solve( s, i+ 1 , 0 , score- 1 ) ;
ll op2 = solve( s, i+ 1 , 1 , score) ;
ll op3 = solve( s, i+ 1 , 2 , score+ 1 ) ;
ans= ( ans% m+ ( ( op1% m + op2% m) % m + op3% m) % m) % m;
}
else if ( prev == 0 ) {
ll op1 = solve( s, i+ 1 , 1 , score) ;
ll op2 = solve( s, i+ 1 , 2 , score+ 1 ) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
else if ( prev== 1 ) {
ll op1 = solve( s, i+ 1 , 0 , score- 1 ) ;
ll op2 = solve( s, i+ 1 , 2 , score+ 1 ) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
else {
ll op1 = solve( s, i+ 1 , 0 , score- 1 ) ;
ll op2 = solve( s, i+ 1 , 1 , score) ;
ans = ( ans% m + ( op1% m + op2% m) % m) % m;
}
}
return dp[ i] [ prev+ 1 ] [ score+ 1010 ] = ans;
}
int countWinningSequences( string s) {
memset ( dp, - 1 , sizeof ( dp) ) ;
return solve( s, 0 , - 1 , 0 ) % m;
}
} ;
Y2xhc3MgU29sdXRpb24gewpwdWJsaWM6CiAgICBpbnQgbSA9IDFlOSs3OwogICAgdHlwZWRlZiBsb25nIGxvbmcgbGw7CiAgICBpbnQgZHBbMTAxMF1bNV1bMjAxMF07CiAgICBsbCBzb2x2ZShzdHJpbmcmIHMsIGludCBpLCBpbnQgcHJldiwgaW50IHNjb3JlKXsKICAgICAgICBpZihpID49IHMuc2l6ZSgpKSB7CiAgICAgICAgICAgIGlmKHNjb3JlID4gMCl7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYoZHBbaV1bcHJldisxXVtzY29yZSsxMDEwXSAhPSAtMSkgcmV0dXJuIGRwW2ldW3ByZXYrMV1bc2NvcmUrMTAxMF07CiAgICAgICAgbGwgYW5zID0gMDsKICAgICAgICBpZihzW2ldID09ICdFJyl7CiAgICAgICAgICAgIGlmKHByZXY9PS0xKXsKICAgICAgICAgICAgICAgIGxsIG9wMSA9IHNvbHZlKHMsIGkrMSwgMCwgc2NvcmUrMSk7CiAgICAgICAgICAgICAgICBsbCBvcDIgPSBzb2x2ZShzLCBpKzEsIDEsIHNjb3JlLTEpOwogICAgICAgICAgICAgICAgbGwgb3AzID0gc29sdmUocywgaSsxLCAyLCBzY29yZSk7CiAgICAgICAgICAgICAgICBhbnM9IChhbnMlbSsgKChvcDElbSArIG9wMiVtKSVtICsgb3AzJW0pJW0pJW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihwcmV2ID09IDApewogICAgICAgICAgICAgICAgbGwgb3AxID0gc29sdmUocywgaSsxLCAxLCBzY29yZS0xKTsKICAgICAgICAgICAgICAgIGxsIG9wMiA9IHNvbHZlKHMsIGkrMSwgMiwgc2NvcmUpOwogICAgICAgICAgICAgICAgYW5zID0gKGFucyVtICsgKG9wMSVtICsgb3AyJW0pJW0pJW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihwcmV2PT0xKXsKICAgICAgICAgICAgICAgIGxsIG9wMSA9IHNvbHZlKHMsIGkrMSwgMCwgc2NvcmUrMSk7CiAgICAgICAgICAgICAgICBsbCBvcDIgPSBzb2x2ZShzLCBpKzEsIDIsIHNjb3JlKTsKICAgICAgICAgICAgICAgIGFucyA9IChhbnMlbSArIChvcDElbSArIG9wMiVtKSVtKSVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBsbCBvcDEgPSBzb2x2ZShzLCBpKzEsIDAsIHNjb3JlKzEpOwogICAgICAgICAgICAgICAgbGwgb3AyID0gc29sdmUocywgaSsxLCAxLCBzY29yZS0xKTsKICAgICAgICAgICAgICAgIGFucyA9IChhbnMlbSArIChvcDElbSArIG9wMiVtKSVtKSVtOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc1tpXSA9PSAnRicpewogICAgICAgICAgICBpZihwcmV2PT0tMSl7CiAgICAgICAgICAgICAgICBsbCBvcDEgPSBzb2x2ZShzLCBpKzEsIDAsIHNjb3JlKTsKICAgICAgICAgICAgICAgIGxsIG9wMiA9IHNvbHZlKHMsIGkrMSwgMSwgc2NvcmUrMSk7CiAgICAgICAgICAgICAgICBsbCBvcDMgPSBzb2x2ZShzLCBpKzEsIDIsIHNjb3JlLTEpOwogICAgICAgICAgICAgICAgYW5zPSAoYW5zJW0rICgob3AxJW0gKyBvcDIlbSklbSArIG9wMyVtKSVtKSVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYocHJldiA9PSAwKXsKICAgICAgICAgICAgICAgIGxsIG9wMSA9IHNvbHZlKHMsIGkrMSwgMSwgc2NvcmUrMSk7CiAgICAgICAgICAgICAgICBsbCBvcDIgPSBzb2x2ZShzLCBpKzEsIDIsIHNjb3JlLTEpOwogICAgICAgICAgICAgICAgYW5zID0gKGFucyVtICsgKG9wMSVtICsgb3AyJW0pJW0pJW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihwcmV2PT0xKXsKICAgICAgICAgICAgICAgIGxsIG9wMSA9IHNvbHZlKHMsIGkrMSwgMCwgc2NvcmUpOwogICAgICAgICAgICAgICAgbGwgb3AyID0gc29sdmUocywgaSsxLCAyLCBzY29yZS0xKTsKICAgICAgICAgICAgICAgIGFucyA9IChhbnMlbSArIChvcDElbSArIG9wMiVtKSVtKSVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBsbCBvcDEgPSBzb2x2ZShzLCBpKzEsIDAsIHNjb3JlKTsKICAgICAgICAgICAgICAgIGxsIG9wMiA9IHNvbHZlKHMsIGkrMSwgMSwgc2NvcmUrMSk7CiAgICAgICAgICAgICAgICBhbnMgPSAoYW5zJW0gKyAob3AxJW0gKyBvcDIlbSklbSklbTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBpZihwcmV2PT0tMSl7CiAgICAgICAgICAgICAgICBsbCBvcDEgPSBzb2x2ZShzLCBpKzEsIDAsIHNjb3JlLTEpOwogICAgICAgICAgICAgICAgbGwgb3AyID0gc29sdmUocywgaSsxLCAxLCBzY29yZSk7CiAgICAgICAgICAgICAgICBsbCBvcDMgPSBzb2x2ZShzLCBpKzEsIDIsIHNjb3JlKzEpOwogICAgICAgICAgICAgICAgYW5zPSAoYW5zJW0rICgob3AxJW0gKyBvcDIlbSklbSArIG9wMyVtKSVtKSVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYocHJldiA9PSAwKXsKICAgICAgICAgICAgICAgIGxsIG9wMSA9IHNvbHZlKHMsIGkrMSwgMSwgc2NvcmUpOwogICAgICAgICAgICAgICAgbGwgb3AyID0gc29sdmUocywgaSsxLCAyLCBzY29yZSsxKTsKICAgICAgICAgICAgICAgIGFucyA9IChhbnMlbSArIChvcDElbSArIG9wMiVtKSVtKSVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYocHJldj09MSl7CiAgICAgICAgICAgICAgICBsbCBvcDEgPSBzb2x2ZShzLCBpKzEsIDAsIHNjb3JlLTEpOwogICAgICAgICAgICAgICAgbGwgb3AyID0gc29sdmUocywgaSsxLCAyLCBzY29yZSsxKTsKICAgICAgICAgICAgICAgIGFucyA9IChhbnMlbSArIChvcDElbSArIG9wMiVtKSVtKSVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBsbCBvcDEgPSBzb2x2ZShzLCBpKzEsIDAsIHNjb3JlLTEpOwogICAgICAgICAgICAgICAgbGwgb3AyID0gc29sdmUocywgaSsxLCAxLCBzY29yZSk7CiAgICAgICAgICAgICAgICBhbnMgPSAoYW5zJW0gKyAob3AxJW0gKyBvcDIlbSklbSklbTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZHBbaV1bcHJldisxXVtzY29yZSsxMDEwXSA9IGFuczsKICAgIH0KICAgIGludCBjb3VudFdpbm5pbmdTZXF1ZW5jZXMoc3RyaW5nIHMpIHsKICAgICAgICBtZW1zZXQoZHAsIC0xLCBzaXplb2YoZHApKTsKICAgICAgICByZXR1cm4gc29sdmUocywgMCwgLTEsIDApJW07CiAgICAgICAgCiAgICB9Cn07