POJ1002电话号码字符串

题目意思:

输入一个串,里面包含一些数字和一些大写字母,以及 - ,字母变换成数字,保证了7个数字,输出重复出现超多1次的电话号码以及次数。规模1e5。

粽子,被这个题目坑了很久,首先是用字符串保存最后的电话号码,二维sort好像不能用,但是string可以用sort,一直wa,今天发现了两个错误,一个是最后扫描个数的时候,会漏掉最后面的一个号码,调整过来又wa了,因为如果只有一组数据,输出了No duplicates. 没有跟新判断无解的条件。第二个错误,是string输出不符合要求,<10000000的数将不会有7个。题目要求7个,就需要补0了。于是得用整数做。用整数做有两种方法,一直开1e7的数组,一种仍然扫描,但是也要注意之前的问题。

整数做AC的代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#define rt return
#define bk break
#define ct continue
#define sf scanf
#define pf printf
#define ms memset
#define si(n) sf("%d",&n)
#define pi(n) pf("%d\n",n)
#define REP0(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define REP(i,s,n) for(int i=s;i<=(n);i++)
#define db double
#define op operator
#define pb push_back
#define LL long long
#define INF 0x3fffffff
#define eps 1e-8
#define PI acos(-1)
#define maxn 10000001
#define maxm 1000
using namespace std;
int n;
char num[]="2223334445556667Q77888999Z";
int s[maxn];
int change(char str[]){
    int x=0,i=0;
    while(str[i]){
        if(isdigit(str[i])){
            x=x*10+str[i]-'0';
        }else if(str[i]!='-')//&&str[i]!='Q'&&str[i]!='Z')
        {
            x=x*10+num[str[i]-'A']-'0';
        }
        i++;
    }
    rt x;
}
bool cmp(int a,int b){
    rt a>b;
}
int main(){
    #ifdef ACBang
    freopen("in.txt","r",stdin);
    #endif
    while(~sf("%d",&n)){
        ms(s,0,sizeof(s));
        for(int i=0;i<n;i++){
            char str[maxm];
            sf("%s",str);
            s[change(str)]++;
        }
        bool ok=true;
        for(int i=0;i<=maxn;i++){
            if(s[i]>1){
                pf("%03d-%04d %d\n",i/10000,i%10000,s[i]);
                ok=false;
            }
        }
        if(ok)puts("No duplicates.");
    }
    rt 0;
}

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#define rt return
#define bk break
#define ct continue
#define sf scanf
#define pf printf
#define ms memset
#define si(n) sf("%d",&n)
#define pi(n) pf("%d\n",n)
#define REP0(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define REP(i,s,n) for(int i=s;i<=(n);i++)
#define db double
#define op operator
#define pb push_back
#define LL long long
#define INF 0x3fffffff
#define eps 1e-8
#define PI acos(-1)
#define maxn 100010
#define maxm 210
using namespace std;
int n;
char num[]={'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','0','7','7','8','8','8','9','9','9'};
string s[maxn];
void change(char str[]){
    int cnt=0,i=0;
    char tmp[maxm];
    strcpy(tmp,str);
    while(tmp[i]){
        if(isdigit(tmp[i])){
            str[cnt++]=tmp[i];
        }else if(tmp[i]!='-'){
            str[cnt++]=num[tmp[i]-'A'];
        }
        if(cnt==3)
            str[cnt++]='-';
        i++;
    }
    str[cnt]='\0';
}
void change2(char ch[],string str){
    for(int i=0;i<3;i++){
        ch[i]=str[i];
    }
    ch[3]='-';
    for(int i=4;i<8;i++){
        ch[i]=str[i];
    }
}
int main(){
    #ifdef ACBang
    freopen("in.txt","r",stdin);
    #endif
    while(~sf("%d",&n)){
        for(int i=0;i<n;i++){
            char str[maxm];
            sf("%s",str);
            change(str);
            s[i]="";
            s[i]+=str;
        }
        sort(s,s+n);
        int cnt=0;
        string tmp="";
        bool ok=true;
        for(int i=0;i<n;i++){
            if(tmp.compare(s[i])==0){
                cnt++;
            }else{
                if(cnt>1){
                    char res[10];
                    change2(res,tmp);
                    pf("%s %d\n",res,cnt);
                    ok=false;
                }
                tmp="";
                tmp+=s[i];
                cnt=1;
            }
        }
        if(cnt>1){
            ok=false;
            char res[10];
            change2(res,tmp);
            pf("%s %d\n",res,cnt);
        }
        if(ok)puts("No duplicates.");
    }
    rt 0;
}

字符串做WA的代码,但是报TLE了,字符串输出超时呀。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#define rt return
#define bk break
#define ct continue
#define sf scanf
#define pf printf
#define ms memset
#define si(n) sf("%d",&n)
#define pi(n) pf("%d\n",n)
#define REP0(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define REP(i,s,n) for(int i=s;i<=(n);i++)
#define db double
#define op operator
#define pb push_back
#define LL long long
#define INF 0x3fffffff
#define eps 1e-8
#define PI acos(-1)
#define maxn 1000010
#define maxm 1000
using namespace std;
int n;
char num[]="2223334445556667Q77888999Z";
int s[maxn];
int change(char str[]){
    int x=0,i=0;
    while(str[i]){
        if(isdigit(str[i])){
            x=x*10+str[i]-'0';
        }else if(str[i]!='-'&&str[i]!='Q'&&str[i]!='Z'){
            x=x*10+num[str[i]-'A']-'0';
        }
        i++;
    }
    rt x;
}
int main(){
    #ifdef ACBang
    freopen("in.txt","r",stdin);
    #endif
    while(~sf("%d",&n)){
        for(int i=0;i<n;i++){
            char str[maxm];
            sf("%s",str);
            s[i]=change(str);
        }
        sort(s,s+n);
//        for(int i=0;i<n;i++)pf("%d\n",s[i]);
        int cnt=1;
        int val=s[0];
        bool ok=true;
        for(int i=1;i<n;i++){
            if(val==s[i]){
                cnt++;
            }else if(cnt>1){
                ok=false;
                pf("%03d-%04d %d\n",val/10000,val%10000,cnt);
                cnt=1;
                val=s[i];
            }else {
                val=s[i];
                cnt=1;
            }
        }
        if(cnt>1){
            pf("%03d-%04d %d\n",val/10000,val%10000,cnt);
            ok=false;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        }
        if(ok)puts("No duplicates.");
    }
    rt 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值