• 洛谷P2580 于是他错误的点名开始了 题解


    qwq!为什么!木有非结构体非指针的题解怎么阔以!所以, 我来辽~咻咻咻~ 题面 来分析, 我们可以先建一棵树,来存储整个名单, 然后再判断

    for (int i = 1; i <= n; i++) {
            root = 0;
            cin >> ch;
            int len = strlen (ch);
            for (int j = 0; j < len; j++) {
                int nu = ch[j] - 'a';
                if (!tr[root][nu]) tr[root][nu] = ++tot;
                root = tr[root][nu];
            }
            f[root] = 1;
        }

    这一段代码是具体的存储的过程, f数组用来存储整个单词被用过几次。可以自己分析品味一哈, 这个root变量到最后存储的其实就是您目前存储的单词的最后一个字母, 也就是代表了这个单词的结束, 所以直接用root这个变量来表示这个单词被用过几次即可。

    for (int j = 0; j < len; j++) {
                int nu = ch[j] - 'a';
                if (!tr[root][nu]) {
                    printf ("WRONG
    ");
                    break;
                }
                root = tr[root][nu];
                if (j == len - 1 && f[root] == 2) printf ("REPEAT
    ");
                if (j == len - 1 && f[root] == 1) f[root] = 2,printf ("OK
    "); 
            }

    查询, 根据题目意思, 按要求输出, 并且要注意换行, 大写之类的细节性问题。要注意, 每一次判断到最后的时候, 判断是否是被用过, 没有被用过的, 需要标记表示应经用过了

    再就是root这个变量每次都要更新(我真的调了好久)

    完整代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    char ch[800000];
    int n, m, tr[8000000][26], s, root, tot, f[8000000];
    int main () {
        scanf ("%d", &n);
        for (int i = 1; i <= n; i++) {
            root = 0;
            cin >> ch;
            int len = strlen (ch);
            for (int j = 0; j < len; j++) {
                int nu = ch[j] - 'a';
                if (!tr[root][nu]) tr[root][nu] = ++tot;
                root = tr[root][nu];
            }
            f[root] = 1;
        }
        scanf ("%d", &m);
        for (int i = 1; i <= m; i++) {
            root = 0;
            cin >> ch;
            int len = strlen (ch);
            for (int j = 0; j < len; j++) {
                int nu = ch[j] - 'a';
                if (!tr[root][nu]) {
                    printf ("WRONG
    ");
                    break;
                }
                root = tr[root][nu];
                if (j == len - 1 && f[root] == 2) printf ("REPEAT
    ");
                if (j == len - 1 && f[root] == 1) f[root] = 2,printf ("OK
    "); 
            }
        }
        return 0;
    }

    谢谢~

  • 相关阅读:
    《敏捷开发修炼之道》学习笔记3:交付用户想要的软件
    Photoshop快捷键大集合
    如何制作已编译的HTML帮助文件(即CHM帮助文件)
    根本不存在 DIV + CSS 布局这回事
    可将视频转换成Gif动画的相关软件
    SEO是什么?与spam有什么区别呢?
    视频六大编辑软件大比拼
    陈彤:一个网络编辑的11年
    最近出现的p2psvr.exe恶意程序的解决办法
    使用火狐浏览器Firefox的一些小技巧
  • 原文地址:https://www.cnblogs.com/yanxiujie/p/11191685.html
Copyright © 2020-2023  润新知