2014年9月13日星期六

[UVa] 409 - Excuses, Excuses!


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h> //isalpha
char keywords[30][100]={'\0'};
char line[30][100]={'\0'};
char new_line[30][100]={'\0'};
int count[30]={0};
int main(){
  freopen("input.txt", "r", stdin);

  int K,E;
  int max=0;
  int excuse=1;
  while(scanf("%d %d",&K,&E)!=EOF){
    
 getchar();
 
 //輸入關鍵字詞
    for(int i=0;i<K;i++){
   gets(keywords[i]);
 }
 //getchar();
 
 //輸入辯詞
 for(int i=0;i<E;i++){
   gets(line[i]);
   
   int len=strlen(line[i]); //獲得line長度
   for(int j=0;j<len;j++)
     new_line[i][j]=line[i][j]; //Copy一份至new_line
   for(int j=0;j<len;j++){ //消除new_line裡所有非字母符號
     if(!isalpha(new_line[i][j])){
     new_line[i][j]=' ';  
  }
  if(new_line[i][j]>='A'&&new_line[i][j]<='Z')new_line[i][j]+=32; //所有大寫換小寫
   }
   //puts(line[i]);
   //puts(new_line[i]);
 }
 
 for(int w=0;w<K;w++) //每個keyword都跑一次
  for(int i=0;i<E;i++){  //每個excuse都跑一次
   int match=0, start=0, flag=0,flag2=0;
   while(new_line[i][flag]!='\0'){
       //如果在excuse中檢查到和單字字首相同,且前一個字元不為字母時,start=1
       if(new_line[i][flag]==keywords[w][0]&&!isalpha(new_line[i][flag-1]))start=1;
    if(new_line[i][flag]==keywords[w][flag2]&&start==1){ //之後的檢查,在start=1的前提下進行
      match=1;  //依然和單字相同時,match維持為1
      flag++;
      flag2++;
    }else{
      start=0;  //一檢查到不是,則start=0、match=0,flag2回到單字起點
      match=0;
      flag++;
      flag2=0;
    }
    //如果檢查到單字字尾,且excuse中後一個字元不為字母,且match=1時,該excuse的單字計數+1
    if( (keywords[w][flag2]=='\0') && (!isalpha(new_line[i][flag])) && (match==1) ){
      count[i]++;
    }
   }
   
 }
 
 printf("Excuse Set #%d\n", excuse);
 excuse++;
 for(int i=0;i<E;i++){
   if(count[i]>=max)max=count[i];
 }
 for(int i=0;i<E;i++){
   if(count[i]==max)puts(line[i]);
 }
 
 //for(int i=0;i<E;i++)printf("%d ",count[i]);
 
 printf("\n");
 
 for(int i=0;i<30;i++)count[i]=0;
 max=0;
  }
  return 0;
}

沒有留言: