8. 壓縮文字檔成績: 10 / 折扣: 0.8背景
壓縮是一種有效減小資料量的方法,目前已經被廣泛應用於各種類型的資訊系統之中。一種壓縮文字檔的方法如下:
- 原始文字檔中的非字母的字元,直接拷貝到壓縮檔中;
- 原始檔案中的詞(全部由字母組成),如果是第一次出現,則將該詞加入到一個詞的列表中,並拷貝到壓縮檔中;否則該詞不拷貝到壓縮檔中,而是將該詞在詞的列表中的位置拷貝到壓縮檔中。
- 詞的列表的起始位置為 1 。
詞的定義為文本中由大小寫字母組成的最大序列。(單詞不跨行)大寫字母和小寫字母認為是不同的字母,即 abc 和 Abc 是不同的詞。詞的例子如下:
- x-ray 包括兩個詞 x 和 ray
- mary's 包括兩個詞 mary 和 s
- a c-Dec 包括三個詞 a 和 c 和 Dec
編寫一個程式,輸入為一組字串,輸出為壓縮後的文本。
輸入
輸入為一段文本,你可以假設輸入中不會出現數字、每行的長度不會超過 80 個字元,並且輸入文本的大小不會超過 10M。
輸出
壓縮後的文本。
#include<stdio.h>#include<string.h>int main(){ int j,k=0,m,t=0,flag=1; char s[84],a[83],word[10000][82]; while( gets(a)!=NULL ) { if(a[0]=='\0'){ printf("\n"); continue;} for(j=0;a[j]!='\0';j++) s[j+1]=a[j]; s[j+1]='\0'; s[0]=' '; j=1;t=0; while(s[j]!='\0') { if( ((s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z')) && !((s[j-1]>='a'&&s[j-1]<='z')||(s[j-1]>='A'&&s[j-1]<='Z')) ) k++; if( (s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z') ) { word[k][t++]=s[j]; if( !((s[j+1]>='a'&&s[j+1]<='z')||(s[j+1]>='A'&&s[j+1]<='Z')) ) { word[k][t]='\0'; flag=1; for(m=0;m<k;m++) { if( !strcmp(word[k],word[m]) ) { printf("%d",m); k--; flag=0; break; } } if(flag) printf("%s",word[k]); } } else { printf("%c",s[j]); t=0; } j++; } printf("\n"); } return 0;}