本文主要是介绍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 ACBangfreopen("in.txt","r",stdin);#endifwhile(~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 ACBangfreopen("in.txt","r",stdin);#endifwhile(~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 ACBangfreopen("in.txt","r",stdin);#endifwhile(~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;
}
这篇关于POJ1002电话号码字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!