Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<algorithm>
- #include<vector>
- #include<string>
- #include<set>
- #include<memory.h>
- #include<map>
- #include<assert.h>
- #include<time.h>
- const int N_ = 3005;
- const int MOD = 1000000007;
- typedef long long lld;
- int N;
- char *A[N_];
- char D[N_][N_];
- lld fac[N_] = {1,};
- bool cmp(const char*a, const char*b){
- return strcmp(a, b) < 0;
- }
- lld GetResult(int left, int right, int depth){
- int i, cnt = 0, last_right = left - 1; lld ret = 1;
- for(i = left; i <= right; i++){
- if(i == right || A[i][depth] != A[i+1][depth]){
- if(A[i][depth] != 0) ret = (ret * GetResult(last_right + 1, i, depth + 1)) % MOD;
- ++cnt; last_right = i;
- }
- }
- ret = (ret * fac[cnt]) % MOD;
- return ret;
- }
- int main(){
- int i, j;
- scanf("%d",&N);
- for(i = 1; i <= N; i++){
- scanf("%s",D[i]); A[i] = D[i];
- fac[i] = (fac[i-1] * i) % MOD;
- }
- std::sort(A+1, A+N+1, cmp);
- printf("%lld\n",GetResult(1, N, 0));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement