WERTYU
2014-10-07 22:50:28

//의지의 한국인 코드

#include <stdio.h>

// 0 1 2 3 4 5 6 7 8 9 10 11 12

// ` 1 2 3 4 5 6 7 8 9 0 - =

// 13 14 15 16 17 18 19 20 21 22 23 24 25

// q w e r t y u i o p [ ] \

// 26 27 28 27 28 29 30 31 32

// a s d f g j k l ; '

// 33 34 35 36 37 38 39 40 41

// z x c v b n m , . /

const char *keyboard = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;\'ZXCVBNM,./ ";

inline int mystrlen(const char* str){int n=0;for(n=0;str[n]!='\0';n++);return n;}

int getIndex(char c){

if(c=='`')return 0;

if(c=='1')return 1;if(c=='2')return 2;if(c=='3')return 3;if(c=='4')return 4;if(c=='5')return 5;

if(c=='6')return 6;if(c=='7')return 7;if(c=='8')return 8;if(c=='9')return 9;if(c=='0')return 10;

if(c=='-')return 11;if(c=='=')return 12;if(c=='Q')return 13;if(c=='W')return 14;if(c=='E')return 15;

if(c=='R')return 16;if(c=='T')return 17;if(c=='Y')return 18;if(c=='U')return 19;if(c=='I')return 20;

if(c=='O')return 21;if(c=='P')return 22;if(c=='[')return 23;if(c==']')return 24;if(c=='\\')return 25;

if(c=='A')return 26;if(c=='S')return 27;if(c=='D')return 28;if(c=='F')return 29;if(c=='G')return 30;

if(c=='H')return 31;if(c=='J')return 32;if(c=='K')return 33;if(c=='L')return 34;if(c==';')return 35;

if(c=='\'')return 36;if(c=='Z')return 37;if(c=='X')return 38;if(c=='C')return 39;if(c=='V')return 40;

if(c=='B')return 41;if(c=='N')return 42;if(c=='M')return 43;if(c==',')return 44;if(c=='.')return 45;

if(c=='/')return 46;

return -1;

}

int main(){

    const char* input="O S, GOMR YPFSU/";

    int n = mystrlen(input);

    int i,idx;

    for(i=0;i<n;i++){

        if(input[i]==' ')idx = 48;

        else idx = getIndex(input[i])-1;

        printf("%c",keyboard[idx]);

    }

    printf("

");

}

▼ more
JAEHASAFE
2014-10-06 23:20:13

//기억하는 것도 좋지만 기억에 의존하면 생각할 여유를 잃을 수 있음.

#include <stdio.h>

#include <string.h>//only for initializing variables.

#define MAX_N 100

#define MAX_STR 10000

//2MB 미만..

char safe[MAX_N][MAX_STR+1]; // => 1 * 10000 * 100 + 1= 1,000,001 bytes

int p[MAX_STR]; //=> 4 * 10000 => 40,000 bytes

inline int mystrlen(const char* str){int n=0;for(n=0;str[n]!='\0';n++);return n;}

int N;

void makeDoubledString(const char* org,char* dst){

    int n_org = mystrlen(org);

    int i=0;

    for(i=0;i<n_org;i++){

        dst[i]=org[i];

    }

    for(i=0;i<=n_org;i++){

        dst[i+n_org] = org[i];

    }

}

void makeRevDoubledString(const char* org,char* dst){

    int n_org = mystrlen(org);

    int i=0;

    for(i=0;i<n_org;i++){

        dst[i]=org[n_org-i-1];

    }

    for(i=0;i<n_org;i++){

        dst[i+n_org] = org[n_org-i-1];

    }

    dst[i+n_org] = '\0';

}

void partialSearch(const char* N, int n){

    int begin = 1, match =0;

    while(begin + match < n){

        if(N[begin + match] == N[match]){

            match ++;

            p[begin + match - 1] = match;

        }else if(!match){begin ++;}

        else{

            begin += match - p[match - 1];

            match = p[match - 1];

        }

    }

}

int firstSearch(const char *H, const char *N){

    int lh = mystrlen(H), ln = mystrlen(N), begin =0, match =0;

    partialSearch(N,ln);

    while(begin < lh - ln){

        if(match < ln && H[begin + match] == N[match]){

            match ++;

            if(match == ln){ return begin;}

        }else if(!match){begin++;}

        else{

            begin += match - p[match -1 ];

            match = p[match -1 ];

        }

    }

    printf("Opps!

");

    return 0;

}

int main(){

    char doubleSafe[MAX_STR*2+1]; // => 1 * 20000 + 1= 20,001 bytes

    char reverseSafe[MAX_STR +1];

    int sum,i,j;

    N=3;

    strcpy(safe[0],"abbab");

    strcpy(safe[1],"babab");

    strcpy(safe[2],"ababb")\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0;

    strcpy(safe[3],"bbaba");

    

    N=2;

    strcpy(safe[0],"RMDCMRCD");

    strcpy(safe[1],"MRCDRMDC");

    strcpy(safe[2],"DCMRCDRM");

    int n_org = mystrlen(safe[0]);

    for(i=0,sum=0;i<N;i++){

        

        //시계방향

        if(i%2==0){

            makeDoubledString(safe[i+1],doubleSafe);

            sum += firstSearch(doubleSafe,safe[i]);    

        }else{

            //책방법

            //makeDoubledString(safe[i],doubleSafe);

            //sum += firstSearch(doubleSafe,safe[i+1]);    

            //내가푼방법..

            makeDoubledString(safe[i+1],doubleSafe);

            sum += n_org - firstSearch(doubleSafe,safe[i]);    

        }

    }

    

    printf("%d

",sum);

}

▼ more
PALINDROMIZE
2014-10-06 22:04:46

#include <stdio.h>

#include <string.h>

#define MAX_N 100

int pi[MAX_N];

inline int mystrlen(const char* str){int n=0;for(n=0;str[n]!='\0';n++);return n;}

void calculateGetSuf(const char* str){

    int n = mystrlen(str);

    int begin = 1, match =0;

    while(begin + match < n){

        if(str[begin + match] == str[match]){

            match++;

            pi[begin + match - 1] = match;

        }else if(match==0){ begin++;}

        else{

            begin += match - pi[match - 1];

            match = pi[match -1 ];

        }

    }

}

int kmpSearchModified2MaxOverlap(const char* H,const char* N){

    calculateGetSuf(N);

    int lh = mystrlen(H), ln = mystrlen(N),begin = 0, match =0;

    while(begin < lh/*-ln*/){

        if(match < ln && H[begin + match] == N[match]){

            match++;

            if(match + begin == lh){

                printf("%d

",begin);

            }

        }else if(match==0){begin ++;}

        else{

            begin += match - pi[match -1 ];

            match = pi[match -1];

        }

    }

    return 0;

}

int main(){

    char str[MAX_N+1];

    char reverseStr[MAX_N+1];

    strcpy(str,"anon");

    int n= mystrlen(str);

    for(int i=0;i<n;i++){

        reverseStr[i] = str[n-i-1];

    }

    reverseStr[n]='\0';

    

    kmpSearchModified2MaxOverlap(str,reverseStr);

    

    return 0;

}

▼ more
NAMING
2014-10-06 21:03:37

//이미 가장 긴 것을 찾았으니 그것의 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);

}

▼ more