您的位置:首页 > 其它

Sicily 1194 Message Flood

2012-01-26 20:43 295 查看
这道题我尝试了两种做法,一开始用的是快排+二分,但是实现起来代码较长,而且效率也不是很高。后来学习了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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: