这道题我尝试了两种做法,一开始用的是快排+二分,但是实现起来代码较长,而且效率也不是很高。后来学习了STL还有哈希等相关内容,发现直接用STL中的map实现起来很非常简洁。第一份是快排+二分的。
#include <stdio.h> #include <string.h> #include <ctype.h> void ksort(int l, int h, char a[][10]){ int e = h; int p = l; char temp[12]; if (h < l + 2) return; while (l < h) { while (++l < e && strcmp(a[l],a[p])<=0); while (--h > p && strcmp(a[h],a[p])>=0); if (l < h) { strcpy( temp,a[l] ); strcpy( a[l],a[h] ); strcpy( a[h],temp ); } } strcpy( temp,a[h] ); strcpy( a[h],a[p] ); strcpy( a[p],temp ); ksort(p, h, a); ksort(l, e, a); } int bisearch(char a[][10], char find[],int l) { int low, mid, upper; low = 0; upper = l - 1; while(low <= upper) { mid = (low+upper) / 2; if(strcmp(a[mid],find)<0) low = mid+1; else if(strcmp(a[mid],find)>0) upper = mid - 1; else return mid; } return -1; } int main() { char name[20000][10]; char send[20000][10]; int n,m,i,j,k,l; scanf( "%d",&n ); while (n!=0) { scanf( "%d",&m ); for ( i=0;i<n;i++ ) { scanf( "%s",&name[i] ); l=strlen(name[i]); for ( j=0;j<l;j++ ) { name[i][j]=tolower(name[i][j]); } } for ( i=0;i<m;i++ ) { scanf( "%s",&send[i] ); l=strlen(send[i]); for ( j=0;j<l;j++ ) { send[i][j]=tolower(send[i][j] ); } } ksort(0,n,name); ksort(0,m,send); for ( i=0;i<m-1;i++ ) { if ( strcmp( send[i],send[i+1] )==0 ) { send[i][0]='0'; } } k=n; for ( i=0;i<m;i++ ) { if ( send[i][0]!='0' ) { if ( bisearch(name,send[i],n)>=0 ) { k--; } } } printf( "%d\n",k ); scanf( "%d",&n ); } return 0; }下面的是利用map实现的代码。
#include <iostream> using namespace std; #include <map> #include <string> int main() { map<string,int> data; int n,m,i,j; string temp; cin >> n; while ( n!=0 ) { cin >> m; for ( i=0;i<n;i++ ) { cin >> temp; for ( j=0;j<temp.length();j++ ) temp[j]=tolower(temp[j]); data[temp]=1; } for ( i=0;i<m;i++ ) { cin >> temp; for ( j=0;j<temp.length();j++ ) temp[j]=tolower(temp[j]); data.erase( temp ); } cout << data.size() << endl; data.clear(); cin >> n; } return 0; }