提出 #72799113


ソースコード 拡げる

#include <stdio.h>
#include <string.h>

/*
typedef unsigned long long ull;

ull mulmod(ull a, ull b, ull m) {
	return (ull)((__int128)a * b % m);
}

#define MOD_BY1 435305701817727911ULL
#define MULT1 288896401212481991ULL
#define MULT_INV1 144381709777699389ULL
#define MOD_BY2 895292565250083751ULL
#define MULT2 540720408979433993ULL
#define MULT_INV2 701011253349988479ULL
*/

char str1[4096];
char str2[4096];

short dp[4096][4096];

int main(void) {
	int len1, len2;
	int i, j, ans = 0;
	if (scanf("%4094s", str1 + 1) != 1) return 1;
	if (scanf("%4094s", str2 + 1) != 1) return 1;
	len1 = (int)strlen(str1 + 1);
	len2 = (int)strlen(str2 + 1);
	for (i = 1; i <= len1; i++) {
		for (j = 1; j <= len2; j++) {
			if (str1[i] == str2[j]) {
				dp[i][j] = dp[i - 1][j - 1] + 1;
				if (dp[i][j] > ans) ans = dp[i][j];
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}

/*

全ての部分文字列のハッシュを用意し、突き合わせる
→ 今回はメモリ制限が厳しいので、厳しそう (最大約16M要素 → 1要素あたり約4B)

チェックする長さを決め打ち
→ ハッシュを用意して突き合わせる
→ ありますか?→二分探索

…でもいいかもだけど、DNAのアライメントのDP的なことをすればよさそう

*/

提出情報

提出日時
問題 B - 共通部分文字列
ユーザ mikecat
言語 C23 (GCC 14.2.0)
得点 20
コード長 1339 Byte
結果 AC
実行時間 27 ms
メモリ 33748 KiB

ジャッジ結果

セット名 set01 set02 set03 set04 set05 set06 set07 set08 set09 set10
得点 / 配点 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2
結果
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
セット名 テストケース
set01 data1
set02 data2
set03 data3
set04 data4
set05 data5
set06 data6
set07 data7
set08 data8
set09 data9
set10 data10
ケース名 結果 実行時間 メモリ
data1 AC 1 ms 1916 KiB
data10 AC 10 ms 1692 KiB
data2 AC 0 ms 1736 KiB
data3 AC 0 ms 1684 KiB
data4 AC 27 ms 33588 KiB
data5 AC 21 ms 33592 KiB
data6 AC 21 ms 33620 KiB
data7 AC 21 ms 33568 KiB
data8 AC 21 ms 33748 KiB
data9 AC 21 ms 33736 KiB