CSES - Datatähti 2019 alku - Results
Submission details
Task:Leimasin
Sender:Aapeli
Submission time:2018-10-13 20:33:04 +0300
Language:C++
Status:COMPILE ERROR

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:58:28: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
     char* merkkijono=malloc(1001*sizeof(char));
                      ~~~~~~^~~~~~~~~~~~~~~~~~~
input/code.cpp:59:26: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
     char* leimasin=malloc(1001*sizeof(char));
                    ~~~~~~^~~~~~~~~~~~~~~~~~~
input/code.cpp:65:21: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
     int* list=malloc(sizeof(int));
               ~~~~~~^~~~~~~~~~~~~
input/code.cpp:80:25: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
             list=realloc(list, sizeof(int)*siirrot);
                  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
input/code.cpp:101:25: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
             list=realloc(list, sizeof(int)*siirrot);
                  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
input/code.cpp:125:29: error: invalid conversion f...

Code

//
//  main.c
//  leimasin
//
//  Created by aapo haavisto on 10/13/18.
//  Copyright © 2018 Aapo Haavisto. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void change_to_star(char* place,int len){
    for (int i=0; i<len; i++) {
        if (place[i]=='\0') {
            break;
        }
        place[i]='*';
    }
}
int tasmaako(char* place, char*key){
        int test=0;
        int again=1;
        while (key[test]!='\0' && again){
            if (place[test]=='\0') {
                return 0;
            }
            if (place[test]==key[test] || place[test]=='*') {
                test++;
            }
            else{
                again=0;
            }
        }
        if(key[test]=='\0'){
            return 1;
        }
        else{
            return 0;
        }
    }

char* find_letter(char* place){
    while (*place=='*') {
        place++;
        if (*place=='\0'){
            return NULL;
        }
    }
    return place;
    
}
    


int main(void) {
    int failed=0;
    char* merkkijono=malloc(1001*sizeof(char));
    char* leimasin=malloc(1001*sizeof(char));
    scanf("%s",merkkijono);
    scanf("%s",leimasin);
    int leimasinPituus=(int)strlen(leimasin);
    int merkkijonoPituus=(int)strlen(merkkijono);
    int siirrot=0;
    int* list=malloc(sizeof(int));
    
    // etsitaan kokonaiset
    char* found=strstr(merkkijono, leimasin);
    if(found==NULL){
        printf("%i",-1);
        free(merkkijono);
        free(leimasin);
    }
    else{
        
        while (found!=NULL) {
         
            change_to_star(found, leimasinPituus);
            siirrot++;
            list=realloc(list, sizeof(int)*siirrot);
            list[siirrot-1]=(int)(found-merkkijono+1);
             found=strstr(merkkijono, leimasin);

        }
        /*printf("%i\n",siirrot);
        printf("%s\n",merkkijono);
         //printf("%i\n",list[0]);
        for (int i=0; i<siirrot; i++) {
            printf("%i, ",list[i]);
        }
        printf("%s","\n\n");*/
        
        // alku, ei loppua
        
        char* spot=strchr(merkkijono, leimasin[0]);
        while (spot!=NULL) {
            
        if (tasmaako(spot, leimasin)){
            change_to_star(spot, leimasinPituus);
            siirrot++;
            list=realloc(list, sizeof(int)*siirrot);
            list[siirrot-1]=(int)(spot-merkkijono+1);
            spot=strchr(merkkijono, leimasin[0]);
        }
        else{
            spot=strchr(spot+1, leimasin[0]);
        }
        }
        /*printf("%i\n",siirrot);
        printf("%s\n",merkkijono);
        for (int i=0; i<siirrot; i++) {
            printf("%i, ",list[i]);
        }
        printf("%s","\n\n");*/
        
        
        //loppu,ei alku
        
        char* spotti=strchr(merkkijono, leimasin[leimasinPituus-1]);
        while (spotti!=NULL) {
            
            if (tasmaako(spotti-leimasinPituus+1, leimasin)){
                change_to_star(spotti-leimasinPituus+1, leimasinPituus);
                siirrot++;
                list=realloc(list, sizeof(int)*siirrot);
                list[siirrot-1]=(int)((spotti-leimasinPituus+1)-merkkijono+1);
                spotti=strchr(merkkijono, leimasin[leimasinPituus-1]);
            }
            else{
                spotti=strchr(spotti+1, leimasin[leimasinPituus-1]);
            }
        }
        /*printf("%i\n",siirrot);
        printf("%s\n",merkkijono);
        for (int i=0; i<siirrot; i++) {
            printf("%i, ",list[i]);
        }*/
        //printf("%c",'\n');

        //ei alku ei loppu
        char* kohta=find_letter(merkkijono);
        /*while (kohta!=NULL) {
        
        int pituus=0;
        char* kohta2=kohta;
        while (*kohta2!='*' && *kohta2!='\0') {
            pituus++;
            kohta2++;
        }
        
        if (pituus>=leimasinPituus){
            failed=1;
        }
        char* osa=malloc(sizeof(char)*pituus+1);
        strncpy(osa, kohta,pituus);
        char* leimakohta=strstr(leimasin, osa);
            if (leimakohta==NULL){
                failed=1;
                break;
            }
        if (kohta-(leimakohta-leimasin)-merkkijono>=0 && kohta-(leimakohta-leimasin)+leimasinPituus-(merkkijono+merkkijonoPituus)<=0){
            siirrot++;
            list=realloc(list, sizeof(int)*siirrot);
            list[siirrot-1]=(int)(kohta-merkkijono+1);
            change_to_star(kohta-(leimakohta-leimasin), leimasinPituus);
            spotti=strchr(merkkijono, leimasin[leimasinPituus-1]);
        }
        else{
            failed=1;
            break;
        }
             kohta=find_letter(merkkijono);
        }*/
        while (kohta!=NULL) {
            char* kohta2=kohta;
            int pituus=0;
            while (*kohta2!='*' && *kohta2!='\0') {
                pituus++;
                kohta2++;
            }
            
            if (pituus>=leimasinPituus){
                failed=1;
                break;
            }
            int kerrat=0;
                //printf("%i",-1);
            
            if(kohta-leimasinPituus+pituus-merkkijono<0){
                
                for(char* i=merkkijono; i<=kohta; i++){
                    if (tasmaako(i, leimasin)){
                        change_to_star(i, leimasinPituus);
                        siirrot++;
                        list=realloc(list, sizeof(int)*siirrot);
                        list[siirrot-1]=(int)(i-merkkijono+1);
                        break;
                    }
                    else{
                        kerrat++;
                    }
                }
                
                
            }
            
            else{
            for(char* i=kohta-(leimasinPituus-pituus); i<=kohta; i++){
                if (tasmaako(i, leimasin)){
                    change_to_star(i, leimasinPituus);
                    siirrot++;
                    list=realloc(list, sizeof(int)*siirrot);
                    list[siirrot-1]=(int)(i-merkkijono+1);
                    break;
                }
                else{
                    kerrat++;
                }
            }
                
            }
            if (kerrat==leimasinPituus-pituus+1){
                failed=1;
                break;
            }
            
            kohta=find_letter(kohta+1);
        
        
        
        
        
        
        
    }
        if (failed){
            printf("%i",-1);
        }
        else
        {
        printf("%i\n",siirrot);
        //printf("%s\n",merkkijono);
        for (int i=siirrot-1; i>=0; i--) {
            printf("%i ",list[i]);
        }
    }
    }
}