답안 #13602

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
13602 2015-02-25T11:58:16 Z tncks0121 원형 문자열 (IZhO13_rowords) C++14
32 / 100
282 ms 113348 KB
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <math.h>
#include <assert.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <string>
#include <functional>
#include <vector>
#include <deque>
#include <utility>
#include <bitset>
#include <limits.h> 
#include <time.h>

using namespace std;
typedef long long ll;
typedef unsigned long long llu;
typedef double lf;
typedef unsigned int uint;
typedef long double llf;
typedef pair<int, int> pii;

const int Z = 2050;

int N, M;
char S[Z], T[Z];

const int dx[] = {  0, -1, -1 };
const int dy[] = { -1, -1,  0 };

int tb[Z + Z][Z];
int par[Z + Z][Z];

int ans;

int main() {
	scanf("%s%s", S + 1, T + 1);
	N = strlen(S + 1);
	M = strlen(T + 1);
	for (int i = N + 1; i <= N + N; i++) S[i] = S[i - N];

	memset(par, -1, sizeof par);

	for (int i = 1; i <= N + N; i++) par[i][0] = 2;
	for (int j = 1; j <= M; j++) par[0][j] = 0;
	for (int i = 1; i <= N + N; i++) {
		for (int j = 1; j <= M; j++) {
			int cands[] = {
				tb[i][j - 1],
				tb[i - 1][j - 1] + (S[i] == T[j]),
				tb[i - 1][j]
			};
			tb[i][j] = *max_element(cands, cands + 3);
			par[i][j] = max_element(cands, cands + 3) - cands;
		}
	}
	
	for (int r = 1; r <= N; r++) {
		/* drop the r-th row */
		{
			int i = r;
			int j;
			for (j = 1; j <= M && par[r][j] != 1; j++);
			if (j > M) continue;
			par[i][j] = 0;

			while (i < N + N && j <= M) {
				if (par[i + 1][j] == 2) ++i; 
				else if (j == M) break;
				else if (par[i + 1][j + 1] == 1) ++i, ++j;
				else ++j;
				par[i][j] = 0;
			}
		}

		// calc answer
		{
			int ret = 0;
			for (int i = N + r, j = M; i > r && j > 0;) {
				int d = par[i][j];
				if (d == 1) ++ret;
				i += dx[d]; j += dy[d];
			}
			ans = max(ans, ret);
		}
	}

	printf("%d\n", ans);
	return 0;
}

Compilation message

rowords.cpp: In function 'int main()':
rowords.cpp:45:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s%s", S + 1, T + 1);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 30 ms 33272 KB Output isn't correct
2 Correct 30 ms 33272 KB Output is correct
3 Correct 30 ms 33400 KB Output is correct
4 Correct 30 ms 33528 KB Output is correct
5 Incorrect 30 ms 33528 KB Output isn't correct
6 Correct 50 ms 42104 KB Output is correct
7 Correct 55 ms 49000 KB Output is correct
8 Incorrect 106 ms 49016 KB Output isn't correct
9 Incorrect 102 ms 49128 KB Output isn't correct
10 Incorrect 94 ms 49016 KB Output isn't correct
11 Incorrect 101 ms 50680 KB Output isn't correct
12 Correct 113 ms 52572 KB Output is correct
13 Incorrect 125 ms 52516 KB Output isn't correct
14 Incorrect 107 ms 51320 KB Output isn't correct
15 Incorrect 123 ms 53140 KB Output isn't correct
16 Incorrect 119 ms 50424 KB Output isn't correct
17 Incorrect 112 ms 51136 KB Output isn't correct
18 Correct 141 ms 55544 KB Output is correct
19 Incorrect 94 ms 49020 KB Output isn't correct
20 Incorrect 142 ms 53100 KB Output isn't correct
21 Correct 114 ms 48888 KB Output is correct
22 Runtime error 218 ms 103672 KB Execution killed with signal 11 (could be triggered by violating memory limits)
23 Runtime error 224 ms 106360 KB Execution killed with signal 11 (could be triggered by violating memory limits)
24 Runtime error 243 ms 108924 KB Execution killed with signal 11 (could be triggered by violating memory limits)
25 Runtime error 282 ms 113348 KB Execution killed with signal 11 (could be triggered by violating memory limits)