這道題用java來做是很快的,可是不知道今天為什麼,用java來做就是ac不了,所以就改用c、c++來做了
解題思路:這一道題其實主要的問題就是解決空格問題以及單詞的重復問題。用stringstream來解決空格問題,
用set來解決殘次的重復問題,這道題也就迎刃而解了。以下附上c和c++的ac代碼.(我的另一片文章中有從網上轉載的大神的streamstring的一些資料)
c++(使用STL來做)
[cpp]
/*
* 2072_2.cpp
*
* Created on: 2013年8月7日
* Author: Administrator
* 總有一天我會追到章澤天的。。。。
*/
#include <iostream>
#include <string>
#include <set>
#include<sstream>
using namespace std;
set<string> words;
int main(){
string row,input;
//getline(cin,row) 用row來保存一行的內容
while(getline(cin,row)&&row!="#"){
words.clear();
//定義一個stringstream類型的對象
stringstream str(row);
//str >> input 給input賦值
while(str >> input){
words.insert(input);
}
cout<<words.size()<<endl;
}
return 0;
}
/*
* 2072_2.cpp
*
* Created on: 2013年8月7日
* Author: Administrator
* 總有一天我會追到章澤天的。。。。
*/
#include <iostream>
#include <string>
#include <set>
#include<sstream>
using namespace std;
set<string> words;
int main(){
string row,input;
//getline(cin,row) 用row來保存一行的內容
while(getline(cin,row)&&row!="#"){
words.clear();
//定義一個stringstream類型的對象
stringstream str(row);
//str >> input 給input賦值
while(str >> input){
words.insert(input);
}
cout<<words.size()<<endl;
}
return 0;
}
c版本(小敬大神奉獻的)
[plain]
#include<cstdio>
#include<cstring>
char ch[110000], a[1100][110], temp[110];
int main()
{
while (1) {
gets(ch);
if (strcmp(ch, "#") == 0) break;
int num = 0, len = strlen(ch);
int start = 0, end;
while (1) {
while (start < len && ch[start] == ' ') ++start;
end = start + 1;
while (end < len && ch[end] != ' ') ++end;
if (start < len) {
int has = 0;
int i;
for (i=start; i<end; ++i) temp[i-start] = ch[i];
temp[i-start] == '\0';
for (int j=0; j<num; ++j) {
if (strcmp(a[j], temp) == 0) {
has = 1;
break;
}
}
if (!has) {
strcpy(a[num], temp);
++num;
}
for (int j=0; j<110; ++j) temp[j] = '\0';
}
else break;
start = end + 1;
}
printf("%d\n", num);
}
return 0;
}
#include<cstdio>
#include<cstring>
char ch[110000], a[1100][110], temp[110];
int main()
{
while (1) {
gets(ch);
if (strcmp(ch, "#") == 0) break;
int num = 0, len = strlen(ch);
int start = 0, end;
while (1) {
while (start < len && ch[start] == ' ') ++start;
end = start + 1;
while (end < len && ch[end] != ' ') ++end;
if (start < len) {
int has = 0;
int i;
for (i=start; i<end; ++i) temp[i-start] = ch[i];
temp[i-start] == '\0';
for (int j=0; j<num; ++j) {
if (strcmp(a[j], temp) == 0) {
has = 1;
break;
}
}
if (!has) {
strcpy(a[num], temp);
++num;
}
for (int j=0; j<110; ++j) temp[j] = '\0';
}
else break;
start = end + 1;
}
printf("%d\n", num);
}
return 0;
}
以下貼一下沒有ac的java的代碼:
[java]
package com.njupt.acm;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class HDU_2072 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str ;
Map map;
while(true){
str = scanner.nextLine();
str = str.trim().replaceAll("\\s{1,}", " ");
if(str.startsWith("#")){
break;
}
String[] strs = str.split(" ");
map = new HashMap();
for(int i = 0 ; i < strs.length ; ++i){
map.put(strs[i], 0);
}
System.out.println(map.keySet().size());
}
}
}
package com.njupt.acm;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class HDU_2072 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str ;
Map map;
while(true){
str = scanner.nextLine();
str = str.trim().replaceAll("\\s{1,}", " ");
if(str.startsWith("#")){
break;
}
String[] strs = str.split(" ");
map = new HashMap();
for(int i = 0 ; i < strs.length ; ++i){
map.put(strs[i], 0);
}
System.out.println(map.keySet().size());
}
}
}