//이미 가장 긴 것을 찾았으니 그것의 presuf 의 가장 긴 것을 찾는 방식으로 간다.
//KMP는 아직은 완벽하지 않으니 필요한 부분은 암기라도 해야함.
#include <stdio.h>
#include <string.h>
#define N 100
int p[N+1];
inline int mystrlen(const char* str){int n=0; for(n=0;str[n]!='\0';n++);return n;}
void getPreSuffix(const char *str){
int n = mystrlen(str);
int begin = 1;
int match = 0;
while(begin + match < n){
if(str[begin + match] == str[match]){
match ++;
p[begin + match - 1] = match;
}else if(match == 0){
begin ++;
}else{
//K = matched - (matched -k)
//p[match - 1] = match - k
begin += match - p[match - 1];
match = p[match - 1];
}
}
}
int main(){
char str[N+1];
strcpy(str,"ababbaba");
getPreSuffix(str);
int n = mystrlen(str);
int k=0;
for(k=p[n-1];k>0;k=p[k-1]){
printf("%d
",k);
}
printf("%d
",n);
}