| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 28419 | Fe (#68) | Play Onwards (FXCUP2_onward) | C++98 | 9 ms | 1492 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<stdio.h>
#include<string.h>
#define N 205
int n,k,net[N][N],b[N][N],drg[N],chk[N],m[N],f[N],cnt;
char s[N][N];
int kmp(int x,int y,int ss,int e){
    int i,j,nn;
    i=j=0;
    nn=e-ss+1;
    while(i<m[y]){
        while(j+1 && s[y][i]-s[x][j+ss])    j=f[j];
        i++;j++;
        if(j==nn)   return 1;
    }
    return 0;
}
void make_f(int x,int ss,int e){
    int i,j,nn;
    i=0;j=-1;
    nn=e-ss+1;
    f[i]=j;
    while(i<nn){
        while(j+1 && s[x][i+ss]-s[x][j+ss])    j=f[j];
        i++;j++;
        f[i]=j;
    }
}
int is_ok(int x,int y){
    int ss,e,i,j;
    for(ss=0;ss<m[x]-k+1;ss++){
        e=ss+k-1;
        make_f(x,ss,e);
        if(kmp(x,y,ss,e))   return 1;
    }
    return 0;
}
int main(){
    int i,j;
    scanf("%d %d",&n,&k);
    for(i=1;i<=n;i++){
        scanf("%s",s[i]);
        m[i]=strlen(s[i]);
    }
    for(i=1;i<=n;i++){
        for(j=i+1;j<=n;j++){
            if(is_ok(i,j))  continue;
            net[i][j]=net[j][i]=1;
        }
    }
    cnt=0;
    for(i=1;i<=n;i++){
        if(chk[i])  continue;
        chk[i]=++cnt;
        b[cnt][drg[cnt]++]=i;
        for(j=i+1;j<=n;j++){
            if(chk[j])  continue;
            for(k=0;k<drg[cnt];k++){
                if(!net[j][b[cnt][k]])  break;
            }
            if(k-drg[cnt])  continue;
            chk[j]=cnt;
            b[cnt][drg[cnt]++]=j;
        }
    }
    if(cnt==1){
        printf("Yes\n");
        printf("2\n");
        for(i=2;i<=n;i++)   printf("1\n");
    }else if(cnt==2){
        printf("Yes\n");
        for(i=1;i<=n;i++)   printf("%d\n",chk[i]);
    }else{
        printf("No\n");
    }
    return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
