백준/문제
3356번: 라디오 전송
스몰스테핑
2024. 9. 13. 12:23
문제 출처 : https://www.acmicpc.net/problem/3356
언어 : Kotlin
문제 설명 :
라디오 방송국은 메시지를 여러 청취자에게 전송한다. 모든 청취자가 메시지를 확실히 받게 하기 위해서 메시지를 계속해서 반복 전송한다.
한 청취자가 받은 메시지가 주어진다. 항상 청취자가 받은 메시지의 길이는 방송국에서 보낸 메시지의 길이보다 크거나 같다. 이때, 라디오 방송국에서 보낸 메시지를 구하는 프로그램을 작성하시오.
즉, 입력으로 S가 주어졌을 때, S가 S' + S' + ... + S'의 부분 문자열이 되는 가장 짧은 부분수열 S'를 구하는 프로그램을 작성하시오.
입력 :
첫째 줄에 S의 길이 L이 주어진다. 둘째 줄에는 길이가 L인 S가 주어진다. 메시지는 알파벳 소문자로만 이루어져 있다. (1 ≤ L ≤ 1,000,000)
출력 :
첫째 줄에 S'의 길이 L'을 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
8 cabcabca |
3 |
풀이 :
import java.io.BufferedWriter
import java.io.OutputStreamWriter
fun main() = with(System.`in`.bufferedReader()) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val l = readLine().toInt()
val s = readLine()
val pi = getPi(s)
bw.write("${l - pi[pi.lastIndex]}")
bw.flush()
bw.close()
}
fun getPi(str: String): IntArray {
val pi = IntArray(str.length)
var j = 0
for(i in 1 until str.length) {
while(j > 0 && str[i] != str[j]) j = pi[j - 1]
if(str[i] == str[j]) pi[i] = ++j
}
return pi
}