题目意思:
输入一个串,里面包含一些数字和一些大写字母,以及 - ,字母变换成数字,保证了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;
}