Think:
1知识点:思维题:map/set/进制模拟映射(康拓展开启迪)
2题意:输入一个字符串,判断“不同”字符串的数量,“不同”字符串的定义为出现的数字种类不尽相同
3思路:
将“相同”字符串映射成同一表现形式,然后判断有多少不同表现形式即可
4思路实现:
(1):进制模拟映射,将不同数字赋予不同的权值,然后求和后排序后判断不同数字的个数
以下为Wrong Answer代码——pow()返回值为double类型,需要强制类型转换
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int tp, link[1014], book[14];
char st[104];
int main(){
int n, i, t, sum;
while(~scanf("%d", &n)){
tp = 0;
while(n--){
scanf("%s", st);
sum = 0;
memset(book, 0, sizeof(book));
for(i = 0; st[i] != '\0'; i++){
t = st[i] - '0';
if(!book[t]){
book[t] = 1;
sum += pow(10, t);
}
}
link[tp++] = sum;
}
sort(link, link+tp);
int ans = 1;
for(i = 1; i < tp; i++){
if(link[i] != link[i-1]){
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}
以下为Accepted代码——十进制模拟映射
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int tp, link[1014], book[14];
char st[104];
int main(){
int n, i, t, sum;
while(~scanf("%d", &n)){
tp = 0;
while(n--){
scanf("%s", st);
sum = 0;
memset(book, 0, sizeof(book));
for(i = 0; st[i] != '\0'; i++){
t = st[i] - '0';
if(!book[t]){
book[t] = 1;
sum += (int)pow(10, t);
}
}
link[tp++] = sum;
}
sort(link, link+tp);
int ans = 1;
for(i = 1; i < tp; i++){
if(link[i] != link[i-1]){
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}
以下为Accepted代码——二进制模拟映射
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int tp, link[1014], book[14];
char st[104];
int main(){
int n, i, t, sum;
while(~scanf("%d", &n)){
tp = 0;
while(n--){
scanf("%s", st);
sum = 0;
memset(book, 0, sizeof(book));
for(i = 0; st[i] != '\0'; i++){
t = st[i] - '0';
if(!book[t]){
book[t] = 1;
sum += (1<<t);
}
}
link[tp++] = sum;
}
sort(link, link+tp);
int ans = 0;
if(tp) ans++;
for(i = 1; i < tp; i++){
if(link[i] != link[i-1]){
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}