当前位置: 首页 > news >正文

LQ0100 人物相关性分析【文本处理】

题目来源:蓝桥杯2019初赛 C++ C组I题

问题描述
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:
在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,
分别是”Alice and Bob” 和”Bob. Alice”。
前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
注意:
1.Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
2.Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。
例如 Bobbi 並不算出现了 Bob。

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

对于所有评测用例,1≤ K ≤1000000。

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

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

样例输出
2

问题分析
文本处理问题,不解释。

AC的C语言程序如下:

/* LQ0100 人物相关性分析 */

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define N 1000000
char a[N + 1];
int len;
int pos1[N / 5], pos2[N / 3];

int isLetter(int n)
{
    if (n < 0 || n >= len) return 0;
    return isalpha(a[n]);
}

int main()
{
    int k;
    fgets(a, N, stdin);
    sscanf(a, "%d", &k);
    fgets(a, N, stdin);
    for (len = 0; a[len] != '\n'; len++);
    a[len++] = '\0';

    int cnt1 = 0, cnt2 = 0;
    for (int i = 0; a[i]; i++) {
        if (!isLetter(i - 1) && strncmp(a + i, "Alice", 5) == 0 && !isLetter(i + 5))
            pos1[cnt1++] = i, i += 5;
        if (!isLetter(i - 1) && strncmp(a + i, "Bob", 3) == 0 && !isLetter(i + 3))
            pos2[cnt2++] = i, i += 3;
    }

    long long ans = 0;
    if (cnt1 != 0 && cnt2 != 0) {
        int l = 0, r = 0;
        for (int i = 0; i < cnt1; i++) {
            while (l < cnt2 && pos2[l] < pos1[i] - k - 3)
                l++;
            while (r < cnt2 && pos2[r] <= pos1[i] + k + 5)
                r++;
            ans += r - l;
        }
    }

    printf("%lld\n", ans);

    return 0;
}

相关文章:

  • 网站推广的方式与技巧/国内最新十大新闻
  • 茶叶网站建设费用明细/惠州seo排名
  • vs2015网站开发教程/自助建站系统软件
  • 做网站要执照吗/广告最多的网站
  • 做网站编辑好还是新媒体编辑/网络营销是做什么的
  • 惠州网站推广排名/关键词排名优化工具有用吗
  • 虚拟形象制作该如何进行?带你深入了解虚拟形象制作
  • 一文读懂TDengine3.0中的事务机制
  • Java入门刷题篇 基础语法->>基本数据类型->>Java1类型转换
  • 入门学python(三)
  • 湖北住建厅七大员报考条件和取证流程
  • 字节码指令 || JVM类加载与字节码技术
  • 哪个开源工作流引擎更好?Flowable or Camunda ?
  • 牛客网专项练习30天Pytnon篇第17天
  • 【Vue】Vue全家桶(九)Vue3
  • #php 递归获取下级元素#
  • 使用 userdel 命令删除 Linux 中的用户
  • Docker部署Archery(v1.9.1)