뇌풀이인 이유는 시험기간이라 구현을 할 시간이 없기 때문이다...
까먹기전에 여기에 기록한다.
https://www.acmicpc.net/problem/32484
학회에서 예선 대비 팀 연습했을 때 만났던 문제이다. 아호코라식을 몰라서 실제 연습때는 던졌는데 롸선배의 풀이 세션에서 깨달음을 좀 얻어서 작성.
여기서 S=10^6,N=10^5정도로 본다.
우선.... 이 문제는 여러 문자열 매칭을 하는 부분을 빼고 풀어보자.
연결되는 부분들에 대해 간선을 이어서 유니온 파인드를 한다고 생각하면 동치임을 쉽게 알 수 있다.
즉 같은 유파의 문자열들은 같은 횟수만큼 나왔어야 한다.
따라서 각 유파에 대해서, 가장 등장횟수가 많은 값 x, 등장횟수가 최대인 문자열의 개수 y, 그 유파의 크기 z를 관리하면
항상 x==y이어야 함을 알 수 있는데,
우리는 등장횟수를 incremental 하게 셀 거기 때문에 이 모든 값들을 관리 할 수 있다.
디테일은 생략~
이제 문자열 매칭을 통한 등장횟수를 세보자.
아마 여기서 아호코라식을 쓰는게 정해일거 같은데...
1. 해싱을 이용한 풀이
매칭해야 하는 문자열들의 서로 다른 길이는 많아야 sqrt(S)정도이다. 이는 서로 다른 길이들의 합을 생각해보면 짧아야 1+2+3....X<=S이어야 하므로 쉽게 알 수 있다.
그렇다면 그 서로 다른 길이 들에 대한 문자열들의 해시값을 넣고, map으로 찾아가면서 등장 횟수를 세주면 된다.
rolling hash로 잘 구현해주면 되는데 문제는 S가 꽤 크다.... 사실 sqrt(S)정도라고 했지만 sum(1,n)=n*(n+1)/2이므로 X에 1000을 넣으면 S-sum(1,1000)=5*10^5정도라 계산값이 1000*(5*10^5)번 나오는데 map에 찾는것도 있고, 유파에서 연산도 있어서 시간이 터진다.
int로 해싱하고, 뭐 별별 짓 다했는데 터지는걸 보니 빡센가 보다.
그래서 생각한점...-> 길이 종류가 다양하다== 각 길이별 문자열이 많이 없다. == 각 길이별 첫 글자로 나올 수 있는 문자는 제한적이다. 이를 이용하면 상수정도는 나눠질거 같은데...짜보진 않음
2. suffix automation을 이용한 풀이
suffix automataion의로 풀면 장점은 노드마다 그 위치에서의 등장 횟수를 세어 줄 수 있다는 점이다.
게다가 노드는 많아야 O(2S)개이다.
그럼 우리는 이런 짓거리를 할 수 있는데, 매칭해야 하는 문자열들의 집합을 사전순으로 정리하고, sa를 순회할 것이다.
이때 각 노드별 구간 [L,R]을 정의하는데,이는 문자열 집합의 L번째 문자열 부터 R번째 문자열까지 이 노드에 도달 할 수 있다는 점이다. 이를 잘 전이하면 되는데 결국 우리는 연속된 구간의 합에 더해주는 연산을 최종적으로는 O(2S)번 한다. 게다가 중요한 점은, 이 구간들은 겹치지 않는다. 이를 이용하면 최종 정답을 구할 수 있는데, 꽤 귀찮아질것 같다.
'알고리즘 공부 > Baekjoon online judge' 카테고리의 다른 글
#28155 Splitting Pairs (0) | 2024.11.19 |
---|---|
#28434 Same Range 뇌풀이 (0) | 2024.08.11 |
#1608 스타대회 (0) | 2023.06.21 |
최근 푼 문제 어려운 것들 정리 (5) | 2022.11.25 |
#25437 Connected Towns (0) | 2022.09.09 |