温柔的手彼此相系

Problem Description
In the world line 1.048596
回到了比过去还遥远的过去,拯救了牧之原翔子和樱岛麻衣后,世界重归平静
时间转眼就到了正月新年。梓川咲太却颇不宁静
“有的时候记住一个电话号码的方法即使把他写成一个容易记住的单词或者短语。比如说要打电话给维克多·孔多利亚大学脑科学研究所,可以拨打TUT-GLOP
”有时候又只是把号码中间的部分数字写成单词,比如说打给310-GINO来向Gino’s订一份pizza。
“还有时候记住一个电话号码的绝佳方式是对号码的数字进行分组,比如说拨打3-10-10-10订一份pizza
“呜哇好难记哦。还有樱岛麻衣小姐好喜欢pizzaaaaa…”趴在暖桌上的梓川咲太开始嘴皮,被对面的樱岛麻衣狠狠的踹了一脚“
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N,和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9
大概就是这样的映射关系,还有电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。当然Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 那么为什么没有Q和Z呢?因为QZnb啊!!!
为什么在新年的时候要帮助樱岛麻衣整理电话本呢?梓川咲太想不通,但这是樱岛麻衣的委托,那就必须做了
“比如说 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。 如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)
“好了讲完了,咲太你快点把里面相同的电话号码的标准格式都输出出来,然后在旁边写上重复次数。如果没有重复的写一个No duplicates.就好了。
梓川咲太还是懒得动脑
“做完了给你奖励。

“请务必穿兔女郎装!!!”

Input
多组输入输出
对于每组输入
第一行是一个正整数n(n<=100000),表示电话号码薄中号码的数量
余下的每行是一个电话号码
每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成
每个电话号码中只会刚好有7个数字或者字母
输入保证n的总和不超过200000

Output
对于每个出现重复的号码产生一行输出
每一行是重复的号码的标准格式紧跟一个空格然后是它的重复次数
如果存在多个重复的号码,则按照号码的字典升序输出
如果没有重复的号码,输出一行: “No duplicates.”(没有双引号)

Sample Input
12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279

Sample Output
310-1010 2
487-3279 4
888-4567 3

题解:麻烦一点的水题,先排序再统计,注意数字输出的时候开头要补0
PS:用字符串会MLE(反正我没过)
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ling long
#define INF 0×3f3f3f3f  //0×7ffffff
#define EPS 1e-6
#define maxn 200000+10
#define PI acos(-1.0)
using namespace std;
int b[maxn];
int main()
{
    int n,flag;
    string a;
    while(~scanf("%d",&n))
    {
        memset(b,0,sizeof(b));
        getchar();
        flag=0;
        for(int k=0;k<n;k++)
        {
            int pop=0;
            getline(cin,a);
            for(int i=0;i<a.length();i++)
            {
                if(a[i]=='0'||a[i]=='1') b[k]+=(a[i]-'0')*pow(10,6-(pop++));
                if(a[i]=='A'||a[i]=='B'||a[i]=='C'||a[i]=='2') b[k]+=2*pow(10,6-(pop++));
                if(a[i]=='D'||a[i]=='E'||a[i]=='F'||a[i]=='3') b[k]+=3*pow(10,6-(pop++));
                if(a[i]=='G'||a[i]=='H'||a[i]=='I'||a[i]=='4') b[k]+=4*pow(10,6-(pop++));
                if(a[i]=='J'||a[i]=='K'||a[i]=='L'||a[i]=='5') b[k]+=5*pow(10,6-(pop++));
                if(a[i]=='M'||a[i]=='N'||a[i]=='O'||a[i]=='6') b[k]+=6*pow(10,6-(pop++));
                if(a[i]=='P'||a[i]=='R'||a[i]=='S'||a[i]=='7') b[k]+=7*pow(10,6-(pop++));
                if(a[i]=='T'||a[i]=='U'||a[i]=='V'||a[i]=='8') b[k]+=8*pow(10,6-(pop++));
                if(a[i]=='W'||a[i]=='X'||a[i]=='Y'||a[i]=='9') b[k]+=9*pow(10,6-(pop++));
            }
        }
        sort(b,b+n);
        int j=0;
        for(int i=0;i<n;)
        {
            while(b[j]==b[i]) j++;
            if(j-i>1)
            {
                flag=1;
                printf("%03d-%04d %d\n",b[i]/10000,b[i]%10000,j-i);//开头补0
                i=j;
            }
            else i=j;
        }
        if(!flag) printf("No duplicates.\n");
    }
    return 0;
}

 

发表评论,支持MarkDown语法