本来AC了一道水题就没想着要写博客的,只不过听取了大佬的意见,用了set集合,才发现大佬给的方法写出来的代码特短
第一次AC代码:
思路很简单,把所有的单词存在数组里,然后只要没有重复出现过,就把总数加一
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s[10005]; char ss[1000][100005]; main (){ while(gets(s)){ if(s[0]=='#') break; int len=strlen(s); int i=0,t=0,l=0; while(i<len){ if(s[i]==' ') while(s[i++]!=' '); else { while(s[i]!=' '&&s[i]!='\0') ss[t][l++]=s[i++]; ss[t][l]='\0'; t++; l=0; } } int flag=0,ans=0; for(int i=0;i<t;i++) { flag=0; for(int j=0;j<i;j++) if(strcmp(ss[i],ss[j])==0) { flag=1; break; } if(!flag) ans++; } printf("%d\n",ans); } }
听取大佬意见后AC代码:
直接运用SET集合的不可重复性,调用字符串的分割函数,得到集合的size即为所求,很显然,代码剪短了很多
#include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<set> #include<cstring> #include<string> using namespace std; char a[1005]; int main (){ set<string> m; while(gets(a)&&a[0]!='#'){ m.clear(); char * tmp=strtok(a," "); while(tmp!=NULL){ m.insert(tmp); tmp=strtok(NULL," "); } printf("%d\n",m.size()); } }