see this
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstdio>
using namespace std;
#define REP(i,n) for((i)=0;(i)<(int)(n);(i)++)
#define foreach(c,itr) for(__typeof((c).begin())
itr=(c).begin();itr!=(c).end();itr++)
typedef long long ll;
#define MOD 1000003ll
ll inv[1000010],f[1000010],finv[1000010];
void pre(void){
int i;
inv[1] = 1;
for(i=2;i<MOD;i++) inv[i] = (MOD - MOD/i) * inv[(int)(MOD%i)] % MOD;
f[0] = finv[0] = 1;
for(i=1;i<MOD;i++) f[i] = f[i-1] * i % MOD;
for(i=1;i<MOD;i++) finv[i] = finv[i-1] * inv[i] % MOD;
}
string s;
int cnt[30];
vector <int> v;
ll dp[30][110]; // pos, runs
ll comb(ll N, ll K){
if(N < K) return 0;
return f[N] * finv[K] % MOD * finv[N-K] % MOD;
}
void calc(void){
int N=v.size(),i,j,k,l;
REP(i,N+1) REP(j,105) dp[i][j] = 0;
dp[1][1] = 1;
int sum = 0;
for(i=1;i<N;i++){
sum += v[i-1];
for(j=1;j<105;j++) if(dp[i][j] != 0){
int one = j+1, two = sum-j;
for(k=0;j+k<105;k++) for(l=0;j+k+2*l<105;l++) if(k+l > 0){
int j2 = j+k+2*l;
ll tmp = comb(one,k) * comb(two,l) % MOD *
comb(v[i]-1,k+l-1) % MOD;
dp[i+1][j2] = (dp[i+1][j2] + dp[i][j] * tmp) % MOD;
}
}
}
}
void main2(void){
int i;
cin >> s;
REP(i,26) cnt[i] = 0;
REP(i,s.length()) cnt[s[i]-'a']++;
v.clear();
REP(i,26) if(cnt[i] > 0) v.push_back(cnt[i]);
int runs = 0;
REP(i,s.length()) if(i == 0 || s[i] != s[i-1]) runs++;
calc();
int N = v.size();
cout << dp[N][runs] << endl;
}
//////////////////////////////// multiple testcases
////////////////////////////////
int main(void){
int T,t;
pre();
scanf("%d",&T);
REP(t,T){
printf("Case #%d: ",t+1);
main2();
}
return 0;
}
its very complicated.......
--
You received this message because you are subscribed to the Google Groups
"google-codejam" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-code?hl=en.