Submission #71348437


Source Code Expand

Copy
#include <stdio.h>
#define MOD_BY 1000000007
int add(int a, int b) {
return a + b - MOD_BY * (a + b >= MOD_BY);
}
int N;
char s[4096];
int memo[4096][4096];
int main(void) {
int pos, available;
if (scanf("%d", &N) != 1) return 1;
if (scanf("%4095s", s) != 1) return 1;
memo[N][0] = 1;
for (pos = N - 1; pos >= 0; pos--) {
for (available = 0; available <= N - pos; available++) {
int unavailable = N - pos - available; /* */
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>

#define MOD_BY 1000000007

int add(int a, int b) {
	return a + b - MOD_BY * (a + b >= MOD_BY);
}

int N;
char s[4096];

int memo[4096][4096];

int main(void) {
	int pos, available;
	if (scanf("%d", &N) != 1) return 1;
	if (scanf("%4095s", s) != 1) return 1;
	memo[N][0] = 1;
	for (pos = N - 1; pos >= 0; pos--) {
		for (available = 0; available <= N - pos; available++) {
			int unavailable = N - pos - available; /* この要素の候補ではない要素の数を計算する */
			int ans = 0;
			int i;
			for (i = 0; i < available; i++) {
				int next_available;
				if ((pos == 0 ? '<' : s[pos - 1]) == s[pos]) {
					/* 同じ方向 → 今の所より「上」のみを次に使える */
					next_available = available - i - 1;
				} else {
					/* 違う方向 → 今の所より「下」のみを次に使える */
					next_available = unavailable + i;
				}
				ans = add(ans, memo[pos + 1][next_available]);
			}
			memo[pos][available] = ans;
		}
	}
	printf("%d\n", memo[0][N]);
	return 0;
}

Submission Info

Submission Time
Task T - Permutation
User mikecat
Language C (gcc 12.2.0)
Score 0
Code Size 1068 Byte
Status TLE
Exec Time 2211 ms
Memory 17896 KiB

Judge Result

Set Name All
Score / Max Score 0 / 100
Status
AC × 5
TLE × 12
Set Name Test Cases
All 0_00, 0_01, 0_02, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13
Case Name Status Exec Time Memory
0_00 AC 0 ms 1720 KiB
0_01 AC 0 ms 1616 KiB
0_02 AC 0 ms 1648 KiB
1_00 AC 0 ms 1724 KiB
1_01 AC 0 ms 1716 KiB
1_02 TLE 2208 ms 17788 KiB
1_03 TLE 2208 ms 17484 KiB
1_04 TLE 2208 ms 17796 KiB
1_05 TLE 2208 ms 17820 KiB
1_06 TLE 2208 ms 17896 KiB
1_07 TLE 2208 ms 17824 KiB
1_08 TLE 2208 ms 17824 KiB
1_09 TLE 2208 ms 17792 KiB
1_10 TLE 2211 ms 17800 KiB
1_11 TLE 2208 ms 17772 KiB
1_12 TLE 2208 ms 17684 KiB
1_13 TLE 2208 ms 17740 KiB


2025-11-30 (Sun)
11:49:13 +09:00