C 13300000000 代表 C 呼入电话

先欣赏一个美图吧
在这里插入图片描述

给一个序列

C 13300000000 代表 C 呼入电话 ,电话号码 13300000000

W 037128* 代表 W 白名单 ,后面可以模糊匹配,而且保证出现在最后一个

如果呼入时电话在白名单中,则可以呼入,否则拒绝

请按输入顺序 输出 每个电话号的 呼入次数,拒绝次数 例如 13300000000 1 0 表示 该号码可以呼入1次,被拒绝0次

样例:

输入:

9
C 13300000000
W 13144444444
C 13144444444
W 037128*
C 03712832233
C 03712832333
C 03712832333
W 03712832*
C 03712832444

输出:

13300000000 0 1
13144444444 1 0
03712832233 1 0
03712832333 2 0
03712832444 1 0

c++

#include <string>
#include <vector>
#include <unordered_map>
#include <iostream>
#include <set>
using namespace std;
 
vector<string> Report(const vector<pair<char, string>> &records)
    {
        vector<string> result;
        if(records.empty()) {
            return result;
        }
        unordered_map<int, set<string>> mp;
        unordered_map<string, pair<int, int>> res;
        vector<string> order;
        for (auto record : records) {
            if (record.first == 'W') {
                mp[record.second.size()-1].insert(record.second.substr(0, record.second.size()-1));
            } else if(record.first == 'C') {
                if(res.find(record.second) == res.end()) {
                    order.push_back(record.second);
                    res[record.second].first = 0;
                    res[record.second].second = 0;
                }
                bool flag = true;
                for(auto m : mp){
                    if(m.second.find(record.second.substr(0, m.first)) != m.second.end()){
                        res[record.second].first++;
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    res[record.second].second++;
                }
            }
        }
        for(auto r : order) {
            string s = r + " " + to_string(res[r].first) + " " + to_string(res[r].second);
            result.push_back(s);
        }
        return result;
    }
// 处理输入
int main(){
vector<string> res;
    int num;
    pair<char, string> p1;
    vector<pair<char, string>> records;
    cin >> num;
    for (size_t i = 0; i < num; i++)
    {
        cin >> p1.first >> p1.second;
        records.push_back(p1);
    }

    //for (size_t i = 0; i < records.size(); i++)
    //{
    //    cout << records[i].first << records[i].second << endl;
    //}

    res = Report(records);

    //for (size_t i = 0; i < res.size(); i++)
    //{
    //    cout << i << res[i] << endl;
    //}
    return 0;
    }

python

from typing import List, Tuple
from collections import defaultdict

def Report(records: List[Tuple[str, str]]) -> List[str]:
    if not records:
        return []
    mp = defaultdict(set)
    res = {}
    order = []
    for record in records:
        if record[0] == 'W':
            mp[len(record[1])-1].add(record[1][:-1])
        elif record[0] == 'C':
            if record[1] not in res:
                order.append(record[1])
                res[record[1]] = [0, 0]
            flag = True
            for m in mp:
                if record[1][:m] in mp[m]:
                    res[record[1]][0] += 1
                    flag = False
                    break
            if flag:
                res[record[1]][1] += 1
    result = []
    for r in order:
        s = r + " " + str(res[r][0]) + " " + str(res[r][1])
        result.append(s)
    return result

num = int(input())
records = []
for i in range(num):
    p1 = input().split()
    records.append((p1[0], p1[1]))

for record in records:
    print(record[0] + record[1])

res = Report(records)

for i, r in enumerate(res):
    print(str(i) + r)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值