프로그래밍 알고리즘
[정올 1332] 작명하기
꾸준한사람
2023. 1. 3. 05:50
반응형
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&code=1332&sca=99
JUNGOL
www.jungol.co.kr
#include <stdio.h>
const int LM = 400100;
char str[LM];
int len, fail[LM], ans[LM], alen; //0에서 idx까지의 접두사=접미사인 최대 길이
int strlen(char* s, int len = 0) {
while (s[len]) len++;
return len;
}
void preKMP() { //fail 배열 채우기
for (int i = 2, prelen = 0; i <= len; i++) { //2번째 문자열부터 끝까지 찾는다.
while (prelen && str[prelen + 1] != str[i]) prelen = fail[prelen]; //현재 누적된 접두접미사가 안 되면 하나 내려가서 비교
if (str[prelen + 1] == str[i]) fail[i] = ++prelen;
}
}
int main(void) {
//freopen("input.txt", "r", stdin);
scanf("%s", str + 1);
len = strlen(str + 1);
preKMP();
ans[alen++] = len;
for (int i = len; fail[i] != 0; i = fail[i]) {
ans[alen++] = fail[i];
}
for (int i = alen - 1; i >= 0; i--) printf("%d ", ans[i]);
printf("\n");
return 0;
}
반응형