# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
143360 | 2019-08-13T19:10:24 Z | nicolaalexandra | Mate (COCI18_mate) | C++14 | 434 ms | 26360 KB |
#include <cstdio> #include <vector> #include <set> #include <cstring> #define DIM 2010 #define MOD 1000000007 using namespace std; //ifstream cin ("date.in"); //ofstream cout ("date.out"); int v[DIM],c[DIM][DIM],f[DIM],dp[DIM][30][30],a[DIM][30]; char s[DIM],l1,l2; int n,i,j,x,y,q,lg; int main (){ scanf("%s",s+1); n = strlen(s+1); for (i=1;i<=n;i++) v[i] = s[i] - 'a' + 1; c[0][0] = c[1][0] = c[1][1] = 1; for (i=2;i<=n;i++){ c[i][0] = 1; for (j=1;j<=i;j++){ c[i][j] = c[i-1][j] + c[i-1][j-1]; if (c[i][j] >= MOD) c[i][j] -= MOD; }} /// a[i][x] - in cate moduri pot selecta s[i],j (am nevoie sa stiu pozitia primului) for (i=1;i<=n;i++) for (j=i+1;j<=n;j++) a[i][v[j]]++; /// dp[i][x][y] - cate siruri de lungime i care se termina cu xy pot obtine for (lg=2;lg<=n;lg++){ for (i=lg-1;i<=n;i++){ x = v[i]; for (y=1;y<=26;y++){ dp[lg][x][y] = dp[lg][x][y]+1LL*a[i][y]*c[i-1][lg-2]%MOD; if (dp[lg][x][y] >= MOD) dp[lg][x][y] -= MOD; }}} scanf("%d",&q); for (;q--;){ scanf("%d %c %c",&lg,&l1,&l2); printf("%d\n",dp[lg][l1-'a'+1][l2-'a'+1]); } return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 10 ms | 760 KB | Output is correct |
2 | Correct | 8 ms | 760 KB | Output is correct |
3 | Correct | 9 ms | 760 KB | Output is correct |
4 | Correct | 12 ms | 760 KB | Output is correct |
5 | Correct | 44 ms | 2808 KB | Output is correct |
6 | Correct | 48 ms | 2936 KB | Output is correct |
7 | Correct | 39 ms | 2808 KB | Output is correct |
8 | Correct | 34 ms | 2680 KB | Output is correct |
9 | Correct | 430 ms | 26360 KB | Output is correct |
10 | Correct | 434 ms | 26360 KB | Output is correct |