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;
}