首页 > 其他分享 >ybtoj字典树练习

ybtoj字典树练习

时间:2023-09-14 15:37:31浏览次数:39  
标签:int ybtoj 练习 tr char ++ maxn now 字典

E. 1.单词拼接

纯狗题,本题交了52发,谁看这个数据范围谁倒霉,真的我祝出题人幸福,看到5e3我果断开始map复杂度\(O(n^2logn)\)

#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
const int maxn = 5e3 + 5;
string s[maxn];
map<string, int> mp2;
signed main() {
    int now = 1;
    while (cin >> s[now]) {
        mp[s[now]] = 1;
        now++;
    }
    s[now] += '$';
    for (int i = 1; i < now; i++) {
        for (int j = 1; j <= now; j++) {
            if (i == j)
                continue;
            string s2;
            s2 += (s[i] + s[j]);
            mp2[s2] = 1;
        }
    }
    for (int i = 1; i < now; i++) {
        if (mp2[s[i]] == 1) {
            cout << s[i] << '\n';
        }
    }
    return 0;
}

但是re了在我疯狂cerr后发现数据范围是\(3e4\)级别,所以这个做法T了...

正确做法:

先把所有字符串塞到trie树里,然后暴力拆分到树里匹配复杂度\(O(n)\)

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
int tr[maxn][200];
int tot;
char c[maxn][250];
int ed[maxn];
int getnum(char c) { return (int)(c - '0'); }
void insert(char *s) {
    int p = 0;
    for (int i = 0; i < strlen(s); i++) {
        int k = getnum(s[i]);
        if (!tr[p][k]) {
            tr[p][k] = ++tot;
        }
        p = tr[p][k];
    }
    ed[p]++;
}
bool find(char *s, int l, int r) {
    if (l > r)
        return 0;
    int p = 0;
    for (int i = l; i <= r; i++) {
        int k = getnum(s[i]);
        if (!tr[p][k]) {
            return 0;
        }
        p = tr[p][k];
    }

    return ed[p];
}
signed main() {
    int now = 0;
    while (cin >> c[++now]) {
        insert(c[now]);
    }
    for (int i = 1; i <= now; i++) {
        int len = strlen(c[i]);
        for (int k = 0; k < len - 1; k++) {
            if (find(c[i], 0, k) && find(c[i], k + 1, len - 1)) {
                cout << c[i] << '\n';
                break;
            }
        }
    }
}

标签:int,ybtoj,练习,tr,char,++,maxn,now,字典
From: https://www.cnblogs.com/jt0007/p/17702601.html

相关文章

  • 字符串小练习
    AC自动机P2414题目描述:阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有\(28\)个按键,分别印有\(26\)个小写英文字母和B、P两个字母。经阿狸研究发现,这个打字机是这样工作的:输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的......
  • Kali linux自带字典路径
    自带字典路径cd/usr/share/wordlistssudogzip-d/usr/share/wordlists/rockyou.txt.gz最后那个rockyou.txt就是字典参考、来源:https://blog.csdn.net/qq_38069830/article/details/131123794......
  • 试题 基础练习 A+B问题
    ,如果你写一个程序不管输入是什么都输入57,则样例数据是对的,但是测试其他数据,哪怕输入是1和2,这个程序也输出57,则对于其他数据这个程序都不正确。数据规模与约定-10000<=A,B<=10000。说明:“数据规模与约定”中给出了试题中主要参数的范围。这个范围对于解题非常重要,不同的数据范......
  • 2023人文素养练习试卷
    判断题共26题,每题1分,合计26分1与书法相比,其他艺术更为简单。正确答案错2忍冬纹样流布甚广,横跨亚欧,在中国延续一千多年,其命名可能是因为纹样颇似忍冬藤,即金银花。对3藻井图案作为石窟覆斗形窟顶的装饰,自北朝西魏经二百年的发展至盛隋代达完美阶段。正确答案错4最......
  • Linux权限管理(练习Ⅰ)
    基本命令练习添加组:jishubu[root@localhost~]#groupaddjishubu添加用户:natasha、mary、mike,密码和用户名相同,然后均加入jishubu组[root@localhost~]#useraddnatasha[root@localhost~]#useraddmary[root@localhost~]#useraddmike[root@localhost~]#echonatash......
  • C语言练习
    声明#include<stdio.h>#include<string.h>#include<windows.h>#include<stdlib.h>//判断一个数是否为奇数//输出1-100之间的奇数第一种:intmain(){inti=0;printf("Oddnumbersbetween1and100are:\n",i);while(i<=100){......
  • 练习:分治算法--有序数组寻找中位数
    题:给定两个长度为m和n有序组数array1和array2,请找出这个有序数组的中位数。'''eg.[1,3]和[5,6],中位数是4[1,2,5,8,9]和[2,3,4,5],中位数是4'''###直接方法,使用内置排序函数sort#时间复杂度最高:O((n+m)log(n+m)),空间复杂度:O(n+m)1classSolution(object):2deff......
  • kali渗透win7靶机练习
    1.准备项目:装有kalilinux的虚拟机win7靶机2.查看一下kali和win7的ip:kali的IP为:192.168.164.129win7靶机的ip为:192.168.164.1873.将kali切换成root模式:4.用kali去ping一下win7靶机:如果ping不动,就要在win7里关掉防火墙(省略)5.启动Metasploit专用的数据库:msfc......
  • 练习:找出出现次数最多的数字
    题:给定一个长度为n的数组nums,请找出其中出现次数大于n/2向下取整的元素。'''如:nums=[1,2,1,2,1]出现最多的元素是1长度为5,5/2向下取整是2,1出现的次数大于2'''###分治算法1classSolution(object):2deffindnum(self,nums):3deffunc(low,high):......
  • swift5笔记(五):字典
    swift5笔记(五):字典Harry__Li关注IP属地:陕西2022.10.3115:48:06字数31阅读176初始化swift中需要指出字典中的类型//初始化字典varmdict:[String:Any]=[:]varmdict1=[String:Any]()letdict:[String:Any]=["name":"lhr","age":"100"]增加......