답안 #13598

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
13598 2015-02-25T11:51:51 Z tncks0121 원형 문자열 (IZhO13_rowords) C++14
32 / 100
281 ms 113368 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;
		}
	}
	
	ans = tb[N][M];
	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 31 ms 33656 KB Output is correct
5 Incorrect 30 ms 33528 KB Output isn't correct
6 Correct 55 ms 42084 KB Output is correct
7 Correct 57 ms 49016 KB Output is correct
8 Incorrect 114 ms 49016 KB Output isn't correct
9 Incorrect 115 ms 49144 KB Output isn't correct
10 Incorrect 100 ms 49140 KB Output isn't correct
11 Incorrect 105 ms 50756 KB Output isn't correct
12 Correct 113 ms 52472 KB Output is correct
13 Incorrect 132 ms 52536 KB Output isn't correct
14 Incorrect 112 ms 51432 KB Output isn't correct
15 Incorrect 122 ms 53108 KB Output isn't correct
16 Incorrect 115 ms 50424 KB Output isn't correct
17 Incorrect 113 ms 51108 KB Output isn't correct
18 Correct 142 ms 55544 KB Output is correct
19 Incorrect 93 ms 49092 KB Output isn't correct
20 Incorrect 132 ms 53084 KB Output isn't correct
21 Correct 100 ms 49008 KB Output is correct
22 Runtime error 222 ms 103552 KB Execution killed with signal 11 (could be triggered by violating memory limits)
23 Runtime error 224 ms 106356 KB Execution killed with signal 11 (could be triggered by violating memory limits)
24 Runtime error 248 ms 108796 KB Execution killed with signal 11 (could be triggered by violating memory limits)
25 Runtime error 281 ms 113368 KB Execution killed with signal 11 (could be triggered by violating memory limits)