답안 #165741

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
165741 2019-11-28T12:30:17 Z Sensei Lozinke (COCI17_lozinke) C++17
85 / 100
1000 ms 33144 KB
#include <bits/stdc++.h>

using namespace std;

const long long P = 61;
const long long MOD = 1e16 + 3;

const int MAXN = 2e4;

long long add (long long x, long long y) {
	return ((x % MOD) + (y % MOD)) % MOD;
}

long long mul (long long x, long long y) {
	return ((x % MOD) * (y % MOD)) % MOD;
}

// vector<char> st[MAXN + 7];
string st[MAXN + 7];
long long fullhash[MAXN + 7];
// vector<long long> subhashes[MAXN + 7];
unordered_set<long long> subhashes[MAXN + 7];
char buff[12];
multiset<long long> fullhashes;

int main () {
	int N;
	cin >> N;

	for (int i = 1; i <= N; i++) {
		// scanf("%s", buff);

		// for (int j = 0; buff[j] != 0; j++) {
		// 	st[i].push_back(buff[j]);
		// }

		cin >> st[i];
	}

	for (int i = 1; i <= N; i++) {
		long long hash = 0;

		for (int j = 0; j < st[i].size(); j++) {
			hash = mul(hash, P);
			hash = add(hash, st[i][j] - 'a' + 1);
		}

		fullhash[i] = hash;
		fullhashes.insert(hash);
	}

	long long ans = 0;

	for (int i = 1; i <= N; i++) {
		for (int ss = 0; ss < st[i].size(); ss++) {
			long long hash = 0;

			for (int j = ss; j < st[i].size(); j++) {
				hash = mul(hash, P);
				hash = add(hash, st[i][j] - 'a' + 1);

				// subhashes[i].push_back(hash);

				if (subhashes[i].find(hash) == subhashes[i].end()) {
					subhashes[i].insert(hash);
					ans += fullhashes.count(hash);
				}
			}
		}

		// sort(subhashes[i].begin(), subhashes[i].end());
	}

	ans -= N;

	// for (int i = 1; i <= N; i++) {
	// 	for (long long hash : subhashes[i]) {
	// 		ans += fullhashes.count(hash);
	// 	}

	// 	ans--;
	// }

	cout << ans << "\n";

	return 0;
}

Compilation message

lozinke.cpp: In function 'int main()':
lozinke.cpp:43:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < st[i].size(); j++) {
                   ~~^~~~~~~~~~~~~~
lozinke.cpp:55:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int ss = 0; ss < st[i].size(); ss++) {
                    ~~~^~~~~~~~~~~~~~
lozinke.cpp:58:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int j = ss; j < st[i].size(); j++) {
                     ~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2040 KB Output is correct
2 Correct 4 ms 2040 KB Output is correct
3 Correct 4 ms 2168 KB Output is correct
4 Correct 5 ms 2168 KB Output is correct
5 Correct 11 ms 3064 KB Output is correct
6 Correct 14 ms 3704 KB Output is correct
7 Correct 20 ms 3960 KB Output is correct
8 Correct 20 ms 4860 KB Output is correct
9 Correct 239 ms 11048 KB Output is correct
10 Correct 96 ms 16504 KB Output is correct
11 Correct 481 ms 15992 KB Output is correct
12 Correct 164 ms 28792 KB Output is correct
13 Correct 206 ms 29432 KB Output is correct
14 Correct 341 ms 21624 KB Output is correct
15 Correct 204 ms 31160 KB Output is correct
16 Correct 213 ms 33144 KB Output is correct
17 Execution timed out 1081 ms 5512 KB Time limit exceeded
18 Execution timed out 1078 ms 4792 KB Time limit exceeded
19 Correct 224 ms 25180 KB Output is correct
20 Execution timed out 1064 ms 19684 KB Time limit exceeded