收获:
set做存储结构(平衡二叉树),需要调用#include <set>
set<string>::iterator,insert;
//程序有问题! //思路:折半查找,插入 //收获:set做存储结构(平衡二叉树),set<string>::iterator,insert; //string::empty(),string重定义后的+号运算 #include <stdio.h> #include <string.h> #include <ctype.h> #define wMax 50 char words[5010][wMax]; int num; void insert(char word[]) { int left,right; left=0; right=num; while(left<right) { int mid=(left+right)/2; if(strcmp(words[mid],word)<0) left=mid+1; else if(strcmp(words[mid],word)>0) right=mid-1; else return; } if(left>right)//第一种情况处理 { num++; strcpy(words[0],word); return ; } if(0==strcmp(words[left],word)) return; if(strcmp(words[left],word)<0) left++; for(int i=num;i>=left;i--) strcpy(words[i+1],words[i]); strcpy(words[left],word); num++; } int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); char line[500],word[wMax]; num=-1; while(gets(line)) { int len=strlen(line); int j=0; memset(word,0,sizeof(word)); for(int i=0;i<len;i++) { if(isalpha(line[i])) word[j++]=tolower(line[i]); else { if(word[0]) insert(word); j=0; memset(word,0,sizeof(word)); } } if(word[0]) insert(word); } for(int i=0;i<=num;i++) printf("%s\n",words[i]); } /*通过 #include <iostream> #include <set> #include <cctype> #include <cstdio> #include <string> using namespace std; int main() { string line; char ch; while((ch=getchar())!=EOF) { line+=tolower(ch); } set<string>dic; for(int i=0;i<line.size();i++) { string word; while(i<line.size() && isalpha(line[i])) {word+=line[i];i++;} if(!word.empty()) dic.insert(word); } for(set<string>::iterator i=dic.begin();i!=dic.end();i++) cout<<*i<<endl; return 0; } */