第十届蓝桥杯 ——人物相关性分析

题目描述
小明正在分析一本小说中的人物相关性。

他想知道在小说中 AliceBob 有多少次同时出现。

更准确的说,小明定义 AliceBob “同时出现”的意思是:在小说文本中 AliceBob 之间不超过 K 个字符。

例如以下文本:

This is a story about Alice and Bob. Alice wants to send a private message to Bob.

假设 K = 20,则 AliceBob 同时出现了 2 次,分别是 Alice and BobBob. Alice

前者 AliceBob 之间有 5 个字符,后者有 2 个字符。

注意:

  1. AliceBob 是大小写敏感的,alicebob 等并不计算在内。
  2. AliceBob 应为单独的单词,前后可以有标点符号和空格,但是不能有字母。例如 Bobbi 並不算出现了 Bob

输入格式
第一行包含一个整数 K。
第二行包含一行字符串,只包含大小写字母、标点符号和空格,长度不超过 1000000。

输出格式
输出一个整数,表示 Alice 和 Bob 同时出现的次数。

数据范围
1 ≤ K ≤ 106

输入样例
20
This is a story about Alice and Bob. Alice wants to send a private message to Bob.

输出样例
2


题解
双指针:

#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;

vector<int> Alice, Bob;

bool check(char c)
{
    return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
}

int main()
{
    int k;
    cin >> k;
    
    getchar();
    
    string s;
    getline(cin, s);
    
    for (int i = 0; i < s.size(); i ++)
    {
        if(s[i] == 'A')
        {
            if(s.substr(i, 5) == "Alice")
                if((i - 1 == -1 || !check(s[i - 1])) && (i + 5 == s.size() || !check(s[i + 5])))
                    Alice.push_back(i);
        }
        else if(s[i] == 'B')
        {
            if(s.substr(i, 3) == "Bob")
                if((i - 1 == -1 || !check(s[i - 1])) && (i + 3 == s.size() || !check(s[i + 3])))
                    Bob.push_back(i);
        }
    }
    
    long long ans = 0;
    for (int i = 0, L = 0, R = 0; i < Alice.size(); i ++)				// 统计 Alice 前面 Bob 出现了几次
    {
        while(R < Bob.size() && Alice[i] > Bob[R]) R ++;
        while(L < R && Alice[i] - Bob[L] > k + 3) L ++;
        ans += R - L;
    }
    
    for (int i = 0, L = 0, R = 0; i < Bob.size(); i ++)					// 统计 Bob 前面 Alice 出现了几次
    {
        while(R < Alice.size() && Bob[i] > Alice[R]) R ++;
        while(L < R && Bob[i] - Alice[L] > k + 5) L ++;
        ans += R - L;
    }
 
    cout << ans << endl;
    return 0;
}
第十届蓝桥杯人物相关性题目是一道经典的编程问题,要求我们在给定的人物关系图中,判断两个人物之间是否存在一条关系链,即判断两个人物是否直接或间接地相关。 在这道题目中,我们可以使用图的搜索算法来解决问题。一种常见的算法是深度优先搜索(DFS),另一种是广度优先搜索(BFS)。 大概的思路是:首先,我们需要构建人物关系图,可以通过邻接矩阵、邻接表等数据结构来存储图的信息。然后,我们选择一个起始节点,从该节点开始进行搜索。如果在搜索的过程中找到了目标节点,即两个人物之间存在直接关系,那么我们可以结束搜索并返回结果。如果没有找到目标节点,则需要继续深入搜索,或者在广度搜索中扩展搜索队列。如果最终搜索完整个图都没有找到目标节点,那么可以判定两个人物之间不存在关系链。 具体实现时,可以使用递归或者栈来实现DFS,使用队列来实现BFS。在DFS中,我们可以利用函数的递归调用来实现深度搜索;在BFS中,我们可以通过队列不断地将待搜索节点加入队列,实现广度搜索。 总的来说,第十届蓝桥杯人物相关性题目考察了对图的数据结构搜索算法的掌握程度。需要我们理解并实现图的构建搜索过程,进而判断两个人物之间的相关性。这道题目不仅考察了编程基础知识,也锻炼了问题分析解决能力,是一道非常有挑战性的编程题目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值