電話番号変換と統計(POJ-1002)
4085 ワード
submitはRuntime Errorで、まだ解決が必要です.しかし、私のパソコンでいくつかのテスト例を実行したのは正しいです.
/**
* http://poj.org/problem?id=1002
*/
#include <iostream>
using namespace std;
/**
*
*/
int valueToKey(char ch){
if(ch >= '0' && ch <= '9') return ch;
if(ch < 'A' || ch > 'Z') return -1;
if(ch == 'Q' || ch == 'Z') return -1;
if(ch <= 'C') return '2';
else if(ch <= 'F') return '3';
else if(ch <= 'I') return '4';
else if(ch <= 'L') return '5';
else if(ch <= 'O') return '6';
else if(ch <= 'S') return '7';
else if(ch <= 'V') return '8';
else return '9';
}
/*void printAllStr(char **strs, int n){
cout<<"ALL String:"<<endl;
for(int i=0;i<n;i++){
cout<<*(strs+i)<<endl;
}
}*/
//
void printString(char *str){
char *p = str;
int i=0;
while(*p != '\0'){
if(i == 3) cout<<"-";
cout<<*p;
i++;
p++;
}
}
int main(){
int n=0;
char ch;
int index;
int i,j;
char **strs;
char tmp[20]; //
cin >> n;
strs = (char **)malloc(sizeof(char *)*n);
//
for(i=0;i<n;i++){
cin >> tmp;
*(strs+i) = (char *)malloc(sizeof(strlen(tmp)+1)); //
memcpy(*(strs+i),tmp, strlen(tmp) + 1); // '\0'
}
// , ( )
for(i=0;i<n;i++){
// i
index = 0;
for(j=0;j<=strlen(*(strs+i));j++){
ch = *(*(strs+i)+j);
// '-'
if(ch == '-') continue;
// '\0'
if(ch == '\0'){
*(*(strs+i)+index) = ch;
break;
}
//
if((ch = valueToKey(ch)) != -1){
*(*(strs+i)+index) = ch;
index++;
}
else{
cout<<"invalid character"<<endl;
return 0;
}
}
cout<<endl;
}
// ( O(nlogn) , )
for(i=0;i<n;i++){
// i-n
int min = i;
for(j=i;j<n;j++){
if(strcmp(*(strs+j), *(strs+min)) < 0){
min = j;
}
}
// i
if(min != i){
char *tmp = *(strs+min);
*(strs+min) = *(strs+i);
*(strs+i) = tmp;
}
}
//
char *current = *strs;
int count = 0;
for(i=0;i<n;i++){
if(strlen(*(strs+i)) != 7) continue; // 7
if(strcmp(*(strs+i), current) == 0){ //
count++;
}
else{ //
if(count > 1){
printString(current);
cout<<" "<<count<<endl;
}
count = 1;
current = *(strs+i);
if(i == n-1) break;
}
}
if(count > 1){ //
printString(current);
cout<<" "<<count<<endl;
}
//printAllStr(strs, n);
return 0;
}