Number String
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1935 Accepted Submission(s): 931
Your task is as follows: You are given a string describing the signature of many possible permutations, find out how many permutations satisfy this signature.
Note: For any positive integer n, a permutation of n elements is a sequence of length n that contains each of the integers 1 through n exactly once.
Each test case occupies exactly one single line, without leading or trailing spaces.
Proceed to the end of file. The '?' in these strings can be either 'I' or 'D'.
ID
DI
DD
?D
??
2
2
1
3
6
Permutation {1,2,3} has signature "II".
Permutations {1,3,2} and {2,3,1} have signature "ID".
Permutations {3,1,2} and {2,1,3} have signature "DI".
Permutation {3,2,1} has signature "DD".
"?D" can be either "ID" or "DD".
"??" gives all possible permutations of length 3.
#include<cstdio>
#include<iostream>
#include<cstring>
#define clr(x) memset(x,0,sizeof(x))
#define LL long long
#define mod 1000000007
using namespace std;
LL dp[][],ans;
char s[];
int main()
{
while(scanf("%s",s)!=EOF)
{
dp[][]=;
for(int i=;i<=strlen(s)+;i++)
{
if(s[i-]=='I')
{
dp[i][]=;
for(int j=;j<=i;j++)
dp[i][j]=(dp[i][j-]+dp[i-][j-])%mod;
}
if(s[i-]=='D')
{
dp[i][i]=;
for(int j=i-;j>=;j--)
dp[i][j]=(dp[i][j+]+dp[i-][j])%mod;
}
if(s[i-]=='?')
{
dp[i][]=;
for(int j=;j<=i-;j++)
dp[i][]=(dp[i][]+dp[i-][j])%mod;
for(int j=;j<=i;j++)
dp[i][j]=dp[i][j-];
}
}
ans=;
for(int i=;i<=strlen(s)+;i++)
ans=(ans+dp[strlen(s)+][i])%mod;
printf("%lld\n",ans);
}
return ;
}