답안 #632904

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
632904 2022-08-21T06:24:40 Z racsosabe Savez (COCI15_savez) C++14
120 / 120
133 ms 31708 KB
#include<bits/stdc++.h>
using namespace::std;

const int B[] = {311, 257};
const int MOD = 1e9 + 7;
const int N = 2000000 + 5;

int mul(int a, int b){
	return (1ll * a * b) % MOD;
}

int pow_mod(int a, int b){
	int r = 1;
	while(b){
		if(b & 1) r = mul(r, a);
		a = mul(a, a);
		b >>= 1;
	}
	return r;
}

int n;
char s[N];
int pot[2][N];
int poti[2][N];
int prefix[2][N];
map<pair<int, int>, int> best;

void init(){
	for(int id = 0; id < 2; id++){
		pot[id][0] = 1;
		for(int i = 1; i < N; i++) pot[id][i] = mul(pot[id][i - 1], B[id]);
		poti[id][N - 1] = pow_mod(pot[id][N - 1], MOD - 2);
		for(int i = N - 2; i >= 0; i--) poti[id][i] = mul(poti[id][i + 1], B[id]);
	}
}

bool check(int l, int len){
	for(int id = 0; id < 2; id++){
		int L = prefix[id][l];
		int R = mul((prefix[id][len] + MOD - prefix[id][len - l]), poti[id][len - l]);
		if(L != R) return false;
	}
	return true;
}

int main(){
	init();
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		scanf("%s", s + 1);
		int len = strlen(s + 1);
		for(int id = 0; id < 2; id++)
		for(int j = 1; j <= len; j++) prefix[id][j] = (prefix[id][j - 1] + mul(pot[id][j], s[j])) % MOD;
		int cur_best = 0;
		for(int l = 1; l <= len; l++){
			if(check(l, len)){
				int cur = 1 + (best.count(make_pair(prefix[0][l], prefix[1][l])) ? best[make_pair(prefix[0][l], prefix[1][l])] : 0);
				cur_best = max(cur_best, cur);
			}
		}
		best[make_pair(prefix[0][len], prefix[1][len])] = max(best[make_pair(prefix[0][len], prefix[1][len])], cur_best);
	}
	int ans = 0;
	for(auto e : best){
		if(ans < e.second) ans = e.second;
	}
	printf("%d\n", ans);
	return 0;
}

Compilation message

savez.cpp: In function 'int main()':
savez.cpp:49:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
savez.cpp:51:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |   scanf("%s", s + 1);
      |   ~~~~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 31564 KB Output is correct
2 Correct 55 ms 31564 KB Output is correct
3 Correct 55 ms 31512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 50 ms 31564 KB Output is correct
2 Correct 51 ms 31528 KB Output is correct
3 Correct 55 ms 31528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 87 ms 31628 KB Output is correct
2 Correct 84 ms 31528 KB Output is correct
3 Correct 107 ms 31640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 31628 KB Output is correct
2 Correct 82 ms 31708 KB Output is correct
3 Correct 92 ms 31692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 31632 KB Output is correct
2 Correct 82 ms 31688 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 86 ms 31620 KB Output is correct
2 Correct 81 ms 31632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 89 ms 31628 KB Output is correct
2 Correct 81 ms 31660 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 31524 KB Output is correct
2 Correct 81 ms 31564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 31660 KB Output is correct
2 Correct 88 ms 31544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 108 ms 31612 KB Output is correct
2 Correct 103 ms 31620 KB Output is correct
3 Correct 133 ms 31604 KB Output is correct