栈练习之——codevs 1051 接龙游戏

编程入门 行业动态 更新时间:2024-10-10 05:21:57

栈练习之——codevs 1051 <a href=https://www.elefans.com/category/jswz/34/1766161.html style=接龙游戏"/>

栈练习之——codevs 1051 接龙游戏

乍一眼看,Trie 树裸题,然后就顺手写了个Trie,然后……MLE 或 RE……codevs上能过8个左右的点,不过数组小玄学,空间用到了110M+,好可怕……
蒟蒻的Trie……

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#define to(c) c - 'a'
using namespace std;
const int MAXN = 24000;
const int Alpha = 26;
const int C = 50;
int map[MAXN * C + 10][Alpha];
int sz;
bool flag[MAXN * C + 10];
int root;
bool find(char *c,int l)
{int now = 0;for(int i = 0;i < l;i ++){if(!map[now][to(c[i])])return false;now = map[now][to(c[i])];}return flag[now];
}
void insert(char *c,int l)
{int now = root;for(int i = 0;i < l;i ++){if(!map[now][to(c[i])])map[now][to(c[i])] = ++sz;now = map[now][to(c[i])];}flag[now] = true;return;
}
int ans;
void dfs(int x,int tot)
{if(!x){ans = max(ans,tot);return;}tot += flag[x];for(int i = 0;i < 26;i ++)dfs(map[x][i],tot);tot -= flag[x];return;
}
char s[MAXN];
int n;
int main()
{scanf("%d",&n);for(int i = 1;i <= n;i ++){scanf("%s",s);insert(s,strlen(s));}for(int i = 0;i < 26;i ++)dfs(map[0][i],flag[0]);printf("%d\n",ans);return 0;
}

那么怎么办呢

有一种神奇的数据结构,叫做栈(天梯石栈相勾连之类的……)
我可以先sort一下,然后开点黑科技(利用下它完全前缀匹配的性质(是这么叫么2333))
然后……然后就解决啦!!!
栈顶为当前string的前缀时,push(),否则,pop(),pop(),pop()……直到能扔进去的时候停
恩恩
解决了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
const int MAXN = 1e5 + 5;
stack <string> s;
string c[MAXN];
bool can(string a,string b)
{if(a == b)return false;if(a.length() > b.length())return false;return a == b.substr(0,a.length());
}
int cnt;
void make_can(string a)
{while(!s.empty() && !can(s.top(),a))s.pop(),cnt--;s.push(a);cnt++;return;
}
int ans;
int n;
int main()
{scanf("%d",&n);for(int i = 1;i <= n;i ++)cin >> c[i];sort(c + 1,c + n + 1);n = unique(c + 1,c + n + 1) - (c + 1);for(int i = 1;i <= n;i ++)if(s.empty() || can(s.top(),c[i]))s.push(c[i]),ans = max(ans,++cnt);elsemake_can(c[i]);printf("%d\n",ans);return 0;
}

转载于:

更多推荐

栈练习之——codevs 1051 接龙游戏

本文发布于:2024-02-27 19:45:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766144.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:接龙   游戏   codevs

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!