답안 #13608

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
13608 2015-02-25T12:15:41 Z tncks0121 원형 문자열 (IZhO13_rowords) C++14
32 / 100
289 ms 113400 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 first row
		{
			int i = r;
			int j;
			for (j = 1; j <= M && par[r][j] != 1; j++);
			if (j <= M) {
				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:46: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 31 ms 33656 KB Output is correct
5 Incorrect 31 ms 33532 KB Output isn't correct
6 Correct 51 ms 42072 KB Output is correct
7 Correct 62 ms 48988 KB Output is correct
8 Incorrect 109 ms 49144 KB Output isn't correct
9 Incorrect 103 ms 49088 KB Output isn't correct
10 Incorrect 102 ms 49056 KB Output isn't correct
11 Incorrect 113 ms 50676 KB Output isn't correct
12 Correct 131 ms 52472 KB Output is correct
13 Incorrect 125 ms 52472 KB Output isn't correct
14 Incorrect 124 ms 51424 KB Output isn't correct
15 Incorrect 128 ms 53044 KB Output isn't correct
16 Incorrect 114 ms 50424 KB Output isn't correct
17 Incorrect 115 ms 51120 KB Output isn't correct
18 Correct 142 ms 55416 KB Output is correct
19 Incorrect 101 ms 49148 KB Output isn't correct
20 Incorrect 141 ms 53112 KB Output isn't correct
21 Correct 118 ms 49016 KB Output is correct
22 Runtime error 225 ms 103416 KB Execution killed with signal 11 (could be triggered by violating memory limits)
23 Runtime error 246 ms 106360 KB Execution killed with signal 11 (could be triggered by violating memory limits)
24 Runtime error 258 ms 108800 KB Execution killed with signal 11 (could be triggered by violating memory limits)
25 Runtime error 289 ms 113400 KB Execution killed with signal 11 (could be triggered by violating memory limits)