文字列 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; }