2018 计蒜之道 初赛 第二场 B 阿里巴巴的手机代理商(简单)[ 字典树 ]

 

 阿里巴巴的手机代理商(简单)

问答

 

阿里巴巴的手机代理商正在研究 infra 输入法的新功能。他们需要分析单词频率以改进用户输入法的体验。于是需要你在系统内核里面写一个 API。 API 有如下功能:

  1. 添加操作

    添加操作格式为insert barty 8,意思为插入barty这个单词,这个单词词频为 88 次。注意如果再次添加insert barty 8操作时,就会将词频增加为 1616 次。(不会出现词频 \le 0≤0 的情况)。

  2. 删除操作

    删除操作格式为delete barty,意思为删除所有barty这个单词。

    如果当前没有删除的词汇,输出Empty

  3. 查询操作

    查询操作格式为query ty,意思为查询当前版本以ty结尾的单词词频总和。

输入格式

第一行读入一个整数 T,代表数据组数。

每组数据的第一行读入一个整数 N代表操作数。

接下来 N行,每行形容一个操作。

保证数据满足 1 ≤ T ≤ 10,1 ≤ N ≤ 1000,insert操作的字符串总长度之和 ≤3000,所有字符串长度 ≤10000,输入只有小写字母。

输出格式

输出题目中要求的结果。

样例输入

1
6
insert barty 8
query ty
insert party 9
query ty
delete barty
query ty

样例输出

8
17
9

题目来源

2018 计蒜之道 初赛 第二场

思路:线段树的模板题目,就是删除的时候用map存一下出现次数就好了,记得每次要清零哦!!!

代码:

#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
const int maxn = 1e6+7;

int trie[maxn][27], tot = 0, t, n;
ll sum[maxn];                         //保存前缀出现的次数
map<string, ll> mp;


void insert(string s)                 //插入单词s
{
    ll p; scanf("%lld", &p);
    mp[s] += p;
    int len = s.length(), root = 0;    //根节点编号为0;
    for(int i = len - 1; i >= 0; i--) {
        int id = s[i] - 'a';           //第一种编号j
        if(!trie[root][id])            //如果之前没有root到id的前缀
            trie[root][id] = ++tot;    //插入,tot即为第一种编号
        root = trie[root][id];         //顺着字典树往下走
        sum[root] += p;                   //前缀后一个位置保存前缀出现的次数;
    }
}

void deletes(string s)
{
    ll p;
    if(mp.count(s) == 0) {
        puts("Empty");
        return;
    }
    if(mp[s] == 0) {
        puts("Empty");
        return;
    }
    p = mp[s]; mp[s] = 0;
    int len = s.length(), root = 0;    //根节点编号为0;
    for(int i = len - 1; i >= 0; i--) {
        int id = s[i] - 'a';           //第一种编号j
        root = trie[root][id];         //顺着字典树往下走
        sum[root] -= p;                //前缀后一个位置保存前缀出现的次数;
    }
}


ll rsearch(string s) {
    int len = s.length(), root = 0;    //从跟节点开始查找;
    for(int i = len - 1; i >= 0; i--) {
        int id = s[i] - 'a';
        if(!trie[root][id]) return 0;     //从root到id的前缀不存在,返回false
        root = trie[root][id];                //为查询下一个字母,顺着字典树往下走
    }
    return sum[root];       //前缀后一个位置保存前缀出现的次数;返回值需改为int;
}

int main()
{
    string a, b;
    //freopen("in.txt", "r", stdin);
    scanf("%d",&t);
    while(t--)
    {
        mp.clear();
        memset(trie, 0, sizeof(trie));
        memset(sum, 0, sizeof(sum));
        scanf("%d",&n);
        while(n--)
        {
            cin >> a >> b;
            if(a == "insert") insert(b);
            else if(a == "delete") deletes(b);
            else printf("%lld\n", rsearch(b));
        }
    }
}

 

基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值