牛客网 练习赛11 B题 假的字符串 tire+topsort判环

基于强化学习框架的交易策略学习过程 每个状态s∈S 是一个由六个微观结构特征构成的向量,这些特征反映了当前市场的订单簿状态和近期交易行为。 阅读详情

题目链接:https://www.nowcoder.com/acm/contest/59#submit/{%22problemIdFilter%22%3A15049%2C%22statusTypeFilter%22%3A%225%22%2C%22page%22%3A1}

链接:https://www.nowcoder.com/acm/contest/59/B
来源:牛客网

题目描述

给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们
输入描述:

第一行一个数表示n
之后n行每行一个字符串表示给定的字符串

输出描述:

第一行输出一个数x表示可行的字符串个数
之后输出x行,每行输出一个可行的字符串
输出的顺序和输入的顺序一致

示例1
输入

6
mcfx
ak
ioi
wen
l
a

输出

5
mcfx
ioi
wen
l
a

备注:

对于100%的数据,
n <= 30000 , 字符串总长<= 300000
字符集为小写字符

解析:

先把字符串全部插入到字典树中,这里要用数组表示的字典树,不然会MLE

1.如果存在字符串A是字符串B的前缀,那么字符串B肯定不可能是最小的情况

2.否则的话,我们判断一个字符串是不是可能最小,我们只要使该字符串的字母是同阶下最小的就行了。譬如说mcfc mcfx mcfm mm xx 要使mcfc最小,那么首先他的第一个字母是要在所有第一个字母中最小的(m

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<string>
#include<set>
#include<vector>

using namespace std;

const int maxn = 1000005;
typedef long long ll;

char str[maxn];
vector<string> dir;
vector<int> ans;
bool vis[30];
set<int> G[30];

bool dfs(int x,int y){//暴力dfs判环,  复杂度可以是挺大的....如果构造了一些数据的话.
    if(x==y&&vis[y]) return true;
    if(vis[x]) return false;
    vis[x]=true;
    for(set<int>::iterator it=G[x].begin();it!=G[x].end();it++){
        int v = *it;
        if(dfs(v,y)) return true;
    }
    return false;
}

struct Trie {
    int ch[maxn][30];
    int val[maxn];
    int sz;
    Trie() {sz = 1; memset(ch[0], 0, sizeof(ch[0]));}
    void clear(){sz = 1;memset(ch[0], 0, sizeof(ch[0]));}
    int idx(char c) {   return c - 'a';     }

    void insert(char *s, int v) {
            int u = 0;
            int n = strlen(s);
            for (int i = 0; i < n; i++) {
                int c = idx(s[i]);
                if (!ch[u][c]) {
                    memset(ch[sz], 0, sizeof(ch[sz]));
                    val[sz] = 0;
                    ch[u][c] = sz++;
                }
        //    val[u]=v;
            u = ch[u][c];
        }
        val[u] = v;
    }

    bool ok(string& s,int v) {
        int u = 0;
        int len=s.size();
        for(int i=0;i<26;i++) G[i].clear();
        for (int i = 0; i < len; i++) {
            int c = idx(s[i]);
            if (!ch[u][c]) break;
            for(int j=0;j<26;j++) if(ch[u][j]&&j!=c) {
                G[c].insert(j);
            }
            u = ch[u][c];
            if(val[u]&&val[u]!=v) return false;
        }
        for(int i=0;i<26;i++) {
            memset(vis,false,sizeof(vis));
            if(dfs(i,i)) return false;
        }
        return true;
    }
};

Trie tree;

int main() {
        int n;
        scanf("%d",&n);
        tree.clear();
        for (int i = 1; i <= n; i++) {
            scanf("%s", str);
            string s(str);
            tree.insert(str, i);
            dir.push_back(s);
        }
        for(int i=0;i<dir.size();i++){
            if(tree.ok(dir[i],i+1)){
                ans.push_back(i);
            }
        }
        printf("%d\n",ans.size());
        for(int i=0;i<ans.size();i++){
            cout<<dir[ans[i]]<<'\n';
        }
    return 0;
}

hsh的,用topsort,这样的话O(n);

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 30005;
const int M = 300005;
const int ALL = (1 << 26) - 1;
struct Trie
{
    int nxt[26], cnt;
    void init()
    {
        for (int i = 0; i < 26; ++i)
            nxt[i] =  0;
        cnt = 0;
    }
} L[M];
int sz;
char s[M];
int st[N], len[N], pos[N];
int E[30][30], deg[30], A[30][30];//A用来去重边.

void clr()
{
    for(register int i = 0; i < 30; ++i)
    {
        deg[i] = 0;
        for (register int j = 0; j < 30; ++j)
            E[i][j] = A[i][j] = 0;
    }
}
void init()
{
    sz = 0;
    L[sz++].init();
}
inline int newnode()
{
    L[sz].init();
    return sz++;
}
inline int check(char s[], int len)
{
    int u = 0;
    for (int i = 0; i < len; ++i)
    {
        int v = s[i] - 'a';
        if(L[u].cnt)
            return false;
        for (register int j = 0; j < 26; ++j)
        {
            if(v != j && L[u].nxt[j] && !A[v][j])
            {
                A[v][j] = 1;
                E[v][++E[v][0]] = j;
                ++deg[j];
            }
        }
        u = L[u].nxt[v];
    }
    return true;
}
inline int topsort()
{
    queue<int>Q;
    int state = 0;
    for (int i = 0; i < 26; ++i)
    {
        if(!deg[i])
            Q.push(i), state |= (1 << i);
    }
    while (!Q.empty())
    {
        int u = Q.front();
        Q.pop();
        for (register int i = 1; i <= E[u][0]; ++i)
        {
            int v = E[u][i];
            if(--deg[v] == 0)
            {
                Q.push(v);
                state |= (1 << v);
            }
        }
    }
    return state == ALL;
}
inline void ins(char s[], int len)
{
    int u = 0;
    for (int i = 0; i < len; ++i)
    {
        int v = s[i] - 'a';
        if(!L[u].nxt[v])
            L[u].nxt[v] = newnode();
        u = L[u].nxt[v];
    }
    L[u].cnt = 1;
}
int main(void)
{
    register int n, i, j, ed;
    scanf("%d", &n);
    init();
    for (i = 1; i <= n; ++i)
    {
        st[i] = st[i - 1] + len[i - 1];
        scanf("%s", s + st[i]);
        len[i] = strlen(s + st[i]);
        ins(s + st[i], len[i]);
    }
    for (i = 1; i <= n; ++i)
    {
        clr();
        if(check(s + st[i], len[i]) && topsort())
        {
            pos[++pos[0]] = i;
        }
    }
    printf("%d\n", pos[0]);
    for (i = 1; i <= pos[0]; ++i)
    {
        int x = pos[i];
        for (ed = st[x] + len[x], j = st[x]; j < ed; ++j)
            putchar(s[j]);
        puts("");
    }
    return 0;
}

抄着kalids的代码的:

#include<bits/stdc++.h>
using namespace std;

#define LL long long
#define N 300010
#define inf 0x3f3f3f3f
#define pb push_back
#define fi first
#define se second
#define mod 9999973
#define md ((l+r)>>1)
#define ls (i<<1)
#define rs (i<<1|1)
const int ALL=(1<<26)-1;
int sz,n;
int A[30][30],E[30][30],st[N],deg[30],pos[N],len[N];
char s[N];
struct Tire{
    int nxt[26],cnt;
    void init(){
        for(int i=0;i<26;++i)
            nxt[i]=0;
        cnt=0;
    }
}L[N];
inline int newnode(){
    L[sz].init();
    return sz++;
}
void insert(char s[],int len){
    int u=0;
    for(int i=0;i<len;++i){
        int v=s[i]-'a';
        if(!L[u].nxt[v]){
            L[u].nxt[v]=newnode();
        }
        u=L[u].nxt[v];
    }
    L[u].cnt=1;
    //printf("L[%d].cnt=1",u);
}
void init(){
    sz=0;
    L[sz++].init();
}
inline bool topsort(){
    int state=0;
    queue<int>Q;
    for(int i=0;i<26;++i){
        if(!deg[i])state|=(1<<i),Q.push(i),deg[i]--;
    }
    while(!Q.empty()){
        int u=Q.front();Q.pop();
        for(int i=1;i<=E[u][0];++i){
            int v=E[u][i];
            if(--deg[v]==0){
                Q.push(v);
                state|=(1<<v);
            }
        }
    }
    return state==ALL;
}
bool check(char s[],int len){
    int u=0;
    for(int i=0;i<len;++i){
        int v=s[i]-'a';
        if(L[u].cnt)return false;
        for(int j=0;j<26;++j){
            if(v!=j&&L[u].nxt[j]&&!A[v][j]){
                A[v][j]=1;
                E[v][++E[v][0]]=j;
                ++deg[j];
            }
        }
        u=L[u].nxt[v];
    }
    return true;
}
inline void clr(){
    for(int i=0;i<30;++i){
        deg[i]=0;
        for(int j=0;j<30;++j){
            A[i][j]=E[i][j]=0;
        }
    }
}

int main(){
    //freopen("in.txt","r",stdin);
    scanf("%d",&n);
    init();
    for(int i=1;i<=n;++i){
        st[i]=st[i-1]+len[i-1];
        scanf("%s",s+st[i]);
        len[i]=strlen(s+st[i]);
        //printf("i:%d   %s\n",i,s+st[i]);
        insert(s+st[i],len[i]);
    }
    //for(int i=1;i<=n;++i){
        //printf("st[i]: %d   len[i] : %d\n",st[i],len[i]);
    //}
    //printf("%d\n", sz);
    for(int i=1;i<=n;++i){
        clr();
        int t1=check(s+st[i],len[i]);
        int t2=topsort();
        //cout<<i <<' '<<t1<<' '<<t2<<endl;
        if(t1&&t2){
            pos[++pos[0]]=i;
            //printf("OK:i = %d\n",i);
        }
    }
    printf("%d\n",pos[0]);
    for(int i=1;i<=pos[0];++i){
        int x=pos[i];
        for(int ed=st[x]+len[x],start=st[x];start<ed;++start){
            putchar(s[start]);
        }puts("");
    }

}
微信小程序 - 强力解决wx.getLocation定位不准的问题,如何修正微信小程序wx.getLocation获取用户位置信息不准确解决办法(高精度定位还是不够精准,定位不准有偏差,彻底消除误差) 如何解决getLocation定位偏差的问题?微信小程序API—wx.getLocation定位不准的问题,微信小程序wx.getLocation获取用户位置信息不准确解决办法,解决微信小程序wx.getLocation定位不准的问题,定位不准确,实际位置偏差大,相差几公里,微信小程序wx.getLocation获取用户位置信息不准确解决办法,关于微信小程序获取准确定位的方法及解决定位不准确的问题,偏差太多好几百米,wx.getLocation 返回定位精度不准问题,如何消除这个误差,开启高精度定位依旧有误 阅读详情

相关推荐

WPF插件架构-如何动态加载封装好的第三方DLL的界面

插件架构中如何自动加载第三方DLL中的UI界面

lg24k的博客 1882

行走路径——拓扑序dp / 记忆化搜索 + 判环

3828. 行走路径 题意: 给定一个 n*m 的矩阵,每个位置有一个数 x (1≤x≤4)。 规定只能按照 1→2→3→4→1→2→...1→2→3→4→1→2→...1→2→3→4→1→2→... 的顺序行走,并且称 1→2→3→41→2→3→41→2→3→4 为一轮。 问,在这个矩阵中,最多能走多少轮? 做法1:拓扑序+dp 做法2:记忆化搜索 ...

Mr_dimple的博客 443

VisualSFM+MeshLab 三维重建全过程记录

VisualSFM+MeshLab 三维重建全过程记录,从下载到运行出结果,以及其中一些可能出现的小问题。通过这两个软件熟悉一下多目立体视觉重建的流程。

何似莫相逢 3万+

拓扑排序(学习笔记)入门+判断是否有环

拓扑排序(学习笔记) 对一个有向无环图(DAG)进行拓扑排序。 实现: 1.在有向图中选一个没有前驱的顶点并且输出 2.从图中删除该顶点和所有出边 3.重复1、2步骤,直至所有顶点输出 初始化: vector<int>vec[maxn]; scanf("%d%d",&n,&m);//n个点,m条边 int n,m,u,v; int InDeg[maxn];//入度 w...

GW_Krystal的博客 911

从315MHz到125kHz:手把手教你用Arduino模拟汽车钥匙的RKE/PKE信号(附代码)

本文详细介绍了如何使用Arduino开发板和射频模块模拟汽车钥匙的RKE/PKE信号,包括硬件准备、代码实现和安全机制。通过实践教程,读者可以深入理解315MHz和125kHz信号在汽车电子领域的应用,掌握无钥匙进入系统的核心技术。

weixin_30945039的博客 223

Windows安装Pytorch3d

pytorch和pytorch3d版本对应关系如下:https://github.com/facebookresearch/pytorch3d/releasescuda和NVIDIA CUB版本对应关系如下:https://github.com/NVIDIA/cub/releases?page=1本人配置如下:GPU:1050TiCUDA:11.1python:3.8。

Snakewood的博客 4286

HDU 5961 传递(BFS)

传递 Problem Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c。 我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全图。换句 话说,将完全图每条边定向将得到一个竞赛图。 下图展示的是一个有4个顶点的竞赛图。   现在,给你两个有向图P =

Expecto__Patronum的博客 506

基于Simulink的PID控制器自动驾驶仿真建模示例

本文通过Simulink仿真平台,详细讲解了基于PID控制器的自动驾驶路径跟踪实现方法。主要内容包括:1)建立自行车运动学模型作为被控对象;2)定义参考路径与横向误差计算方法;3)设计PD控制器并调试参数;4)在Simulink中搭建完整仿真模型;5)分析30km/h车速下的双移线跟踪性能。文章强调PID控制作为自动驾驶入门基础的重要性,并指出其在中低速场景下的适用性,同时给出了工程实践中的优化建议(如前视距离、抗积分饱和等)和扩展方向(如Stanley控制器)。通过完整案例,帮助读者掌握车辆运动学建模和P

xiaoheshang_123的博客 65

拓扑排序dfs版+判环

以前就听说拓扑排序可以用dfs来写了,只是一直没有去尝试,想一想的话会觉得很复杂,dfs怎么排? 要从入度为0的点出发吗? 如果有多个入度为0的点,每个都dfs一遍吗?那他们不是会有重复不是会乱套? 总之,对于从来都是用bfs写拓扑的我来说,觉得用dfs简直不可思议。但是了解之后,买毛病!精彩!而且还学会了一张图如何判环(因为有环的图是不能拓扑排序的)。 总体思路就是:dfs + 栈。 ...

姬小野的博客 2675

C#【必备技能篇】Winform实现多语言切换(.resx文件的应用)

在实际的项目开发中,软件需要实现多语言切换。本文通过一个实际的例子,可以让你学习到这个技能。

星Yeah 的博客 1万+

YOLOv11改进 | 特殊场景检测篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv11的主干上针对于图像的输入进行增强,同时该网络的并不会增加参数和计算量,基本和普通的网络结构保持一致,同时该结构支持自定义调节层数,来控制图像增强的效果 ,非常适合想要在黑夜目标检测领域发表文章的读者,该基本网络不会影响模型的速度。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 2207

TopSort(拓扑排序)

对输入的有向图进行拓扑排序,并输出一个拓扑有序序列;如果存在有向环,则给出提示信息。 假设输入文件中有向图的格式为:首先是定点个数n和边数m;然后是每条边,每条边的数据占一行,格式为 u v,表示从定点u 到顶点 v的一条有向边,顶点序号从1开始计起。输入文件的最后一行为0 0,表示输入数据结束。 样例输入: 6 8 1 2 1 4 2 6 3 2 3 6 5 1 5 2 5

Irish_Moonshine的博客 880

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

算法大师! 1117

牛客想开了大赛2 E:假的字符串(字典树)

链接:https://ac.nowcoder.com/acm/contest/907/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们 输入...

bravo的博客 294

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

牛客练习赛11 - B 假的字符串 (字典树+拓扑排序)

链接:https://www.nowcoder.com/acm/contest/59/B来源:牛客网题目描述给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们 输入描述:第一行一个数表示n 之后n行每行一个字符串表示给定的字符串输出描述:第一行输出一个数x表示可行的字符串个数 之后输出x行,每行输出一个可行的字符串 输出的顺...

Mr_Treeeee的博客 758

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

偏序+拓扑序+字典树

题目描述 给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们 输入描述: 第一行一个数表示n之后n行每行一个字符串表示给定的字符串 输出描述: 第一行输出一个数x表示可行的字符串个数之后输出x行,每行输出一个可行的字符串输出的顺序和输入的顺序一致 示例1 输入 6 mcfx ...

weixin_30294021的博客 204

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【牛客练习赛11】 B 假的字符串【字典树+topo判环】

链接:https://www.nowcoder.com/acm/contest/59/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们

lzs_lazy 852

topsort top排序(队列,优先队列)。

topsort 是对有向图的排序; #include<queue>//这个是判断环的 要求拓扑序的话就在其中加上计数的部分。 using namespace std; priority_queue<int> Q; bool topsort() {   for(int i=1;i<=n;i++)   {     if(in...

weixin_30682127的博客 238

POJ3889Fractal Streets 递归+ 坐标变换

参考:https://vjudge.net/solution/10966515他这个地方是 1 4 2 3的标号在递归的过程中要知道如何处理”轴对称”,”点对称” 的方式/LL P4[50]; void gao(LL n,LL a,LL &x,LL &y){ if(n==1){ if(a==1)x=y=1; if(a==2)x=1,y=2;

now_ing的博客 1398

Codeforces 842C - Ilya And The Tree 【树上DFS】

**【题意】给出一棵生成树,每个节点都有一个值,现在要求出每个节点的美丽值的最大值,美丽值的定义为从根节点到该节点(包含)路径上所有点的值的gcd,求解每个点时可以把路径上某一个点的值变为0。你可以认为每个点美丽值的求解是独立的。**按道理可以dp 的。不知道为什么错。没有数据。。别人的代码ac。。 #include <bits/stdc++.h> using namespace std;const

now_ing的博客 976

Gym - 101246C dfs

https://vjudge.net/problem/Gym-101246C这种美剧和思维可能我都不太会。。。 学习一下这种代码。。char tu[mxn][mxn]; int mp[mxn]; int n,m; int dp[1<<26]; int lowbit(int x){return x&(-x);} int init(int state){ if(dp[state])return

now_ing的博客 374

Sticks POJ - 1011 经典dfs..

参考:http://www.hankcs.com/program/algorithm/poj-1011-sticks.html#include<bits/stdc++.h>using namespace std; #define N 51 int n;int finish; int in[N]; int length; void check(int count,int len,int plen){

now_ing的博客 358

Codeforces Round #359 (Div. 2) C. Robbers' watch dfs

参考http://www.cnblogs.com/baocong/p/5913936.html题意:给你n和m,找出(a,b)的对数,其中a满足要求:0<=a<n,a的7进制的位数和n-1的7进制的位数相同,b满足要求:0<=b<m,b的7进制的位数和m-1的7进制的位数相同,且a和b的7进制下的位上的数都不相同,即如果a的七进制数为10,b的7进制数为21,这种情况是不行的,因为重复了1 题解:先

now_ing的博客 353

codeforces 679B Bear and Tower of Cubes(贪心+dfs)

参考http://blog.youkuaiyun.com/sinat_34263473/article/details/51620773 http://www.cnblogs.com/macinchang/p/5572070.htmlBear and Tower of Cubes time limit per test 2 seconds memory limit per test 256 megab

now_ing的博客 312

记忆化搜索 dp(dfs)-帮助Jimmy POJ--1661

感悟:首先自己没有把题目都看透。结果在看一些别人的题解的时候在疑惑如果平板高度相等的时候怎么办。 也浪费了时间,也没有看到一开始给只有一个横坐标 体会:虽然知道是有两个状态转移,但是怎么表示,如果用的是那种循环式的dp的话,达到下一种状态的判断怎么写,而且我居然没有考虑从上到下的高度排序。。 然后看别人的代码,感觉用dfs(记忆化搜索)写的比较看得懂, 而且还有一种数位dp的模板的感觉。。

now_ing的博客 298

Gym - 101164I dfs

https://vjudge.net/contest/170300#problem/Idfs//其实这里deep应该是个数的意思把。。。int st[maxn]; int cnt=0; bool dfs(int n,int start,int deep){ if(n<0)return 0; if(deep==0){ if(n==0){

now_ing的博客 280
上一篇: TCO 11 muddy round (贪心求 期望dp)
下一篇: Gym - 101608G (尺取)
sega_handsome
博客等级 码龄10年 7粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值