我的题解:手机号码
#include<bits/stdc++.h>
using namespace std;
bool cmp(char *p1,char *p2){
return strcmp(p1,p2)<0;
}
//判断p1是否是p2的前缀
bool pre(char * p1,char *p2){
for(int i=0;i<strlen(p1);i++){
if(p1[i]!=p2[i])return false;
}
return true;
}
//n位有多少种号码可能
long long sum(int n){
long long r=1;
for(int i=0;i<n;i++){
r*=10;
}
return r;
}
int main(){
int n,m;
long long ans;
char s[50][20];
char *t[50];
int c[50]={};//记录该保留号是否以其他保留号为前缀
cin>>n>>m;
ans=sum(n);
for(int i=0;i<m;i++){
cin>>s[i];
t[i]=s[i];
}
sort(&t[0],&t[0]+m,cmp);//保留号字典排序
for(int i=0;i<m;i++){
for(int j=i+1;j<m;j++){
if(pre(t[i],t[j]))c[j]=1;//前缀
}
}
for(int i=0;i<m;i++){
if(c[i]==0){
ans-=sum(n-strlen(t[i]));
}
}
cout<<ans;
return 0;
}
using namespace std;
bool cmp(char *p1,char *p2){
return strcmp(p1,p2)<0;
}
//判断p1是否是p2的前缀
bool pre(char * p1,char *p2){
for(int i=0;i<strlen(p1);i++){
if(p1[i]!=p2[i])return false;
}
return true;
}
//n位有多少种号码可能
long long sum(int n){
long long r=1;
for(int i=0;i<n;i++){
r*=10;
}
return r;
}
int main(){
int n,m;
long long ans;
char s[50][20];
char *t[50];
int c[50]={};//记录该保留号是否以其他保留号为前缀
cin>>n>>m;
ans=sum(n);
for(int i=0;i<m;i++){
cin>>s[i];
t[i]=s[i];
}
sort(&t[0],&t[0]+m,cmp);//保留号字典排序
for(int i=0;i<m;i++){
for(int j=i+1;j<m;j++){
if(pre(t[i],t[j]))c[j]=1;//前缀
}
}
for(int i=0;i<m;i++){
if(c[i]==0){
ans-=sum(n-strlen(t[i]));
}
}
cout<<ans;
return 0;
}