文字列 add, remove, find 実装

以下の命令を実行する簡易的な入れ物を実装しなさい。
add str : 文字列 strを登録
remove str: 文字列 strが登録済みの場合は登録削除
find str : 文字列 strが登録済みの場合は yes 、さもなくば no と出力

入力: 最初の行に命令の数 nが与えられる。続くn行にn件の命令。
出力: 各find命令の実行結果として yes または no を1行に出力して改行。
制約: 1 <= 文字列の長さ <= 12
n <= 1,000,000
removeの実行は合計20回以内
参考: AOJ ALDS1_4_C 辞書(探索)

入力例:
5
add AAA
add BBC
remove AAA
find AAA
find BBC

出力例:
no
yes

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

int main(void){
    int n,i,len=0;
    char order[10000][10000],str[10000][10000],stock[10000][10000];
    
    scanf("%d",&n);
    
    for (i=0;i<n;i++){
       scanf("%s %s",&order[i], &str[i]);
      if (strcmp(order[i],"add")==0){
          AddString(stock,&len,str[i]);
      }else if(strcmp(order[i],"remove")==0){
          removeString(stock, &len, str[i]);
      }else if(strcmp(order[i],"find")==0){
            findString(stock , &len, str[i]);
      }else{
          printf("error\n");
      }
      //printString(stock,len,str[i],order[i]);
    }
    return 0;
}

void printString(char stock[10000][10000], int len, char str[10000], char order[10000]){
    printf("len= %d str= %s order= %s\n",len,str,order);
    int i;
    for(i=0;i<len;i++){
        printf("%s ",stock[i]);
    }
    printf("\n");
    return;
}

void AddString(char stock[10000][10000],int *len,char str[10000]){
    strcpy(stock[*len],str);
    (*len)++;
    return;
}

void removeString(char stock[10000][10000],int *len,char str[10000]){
    int i=0,j=0;
    for(i=0;i<*len;i++){
        if(strcmp(stock[i],str)==0){
            for(j=i;j<*len;j++){
                strcpy(stock[j],stock[j+1]);
            }
            (*len)--;
        }
    }
    return;
}

void findString(char stock[10000][10000],int *len,char str[10000]){
    int i=0,j=0,flag=0;
    for(i=0;i<*len;i++){
        if(strcmp(stock[i],str)==0){
                flag=1;
                printf("yes\n");
                break;
        }
    }
    if(flag==0){
        printf("no\n");
    }
    return;
}