问题 E: 词链
时间限制: 1 Sec 内存限制: 128 MB
提交: 10 解决: 4
[提交] [状态] [讨论版] [命题人:201824100354]
题目描述
给定一个仅包含小写字母的英文单词表,其中每个单词最多包含 50 个字母。
如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词链。例如下面的单词组成了一个词链:
i
int
integer
而下面的单词不组成词链:
integer
intern
请在给定的单词表中取出一些词,组成最长的词链。最长的词链就是包含单词数最多的词链。
数据保证给定的单词表中,单词互不相同,并且单词按字典顺序排列。
输入
第一行一个整数 n ,表示单词表中单词数。
下接 n 行每行一个单词。
输出
一个整数,表示最长词链长度。
样例输入
5 i int integer intern internet
样例输出
4
提示
【数据范围】
50% 的数据, n<=1000
100% 的数据, n<=10000
已经为我们排好了序,我们只需要维护一个栈,来让符合条件的字符串不断地加栈,入栈,来达到最后的最
大单词数即可。
#include<bits/stdc++.h>
using namespace std;
int cmp(string a ,string b){
if(a.size()>b.size()){
return 0;
}else {
b.resize(a.size());
if(a==b) return 1;
else return 0;
}
}
int n;
int ans=0;
stack<string> st;
string s;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
while(st.size()&&!cmp(st.top(),s)){
st.pop();
}
st.push(s);
ans=max(ans,(int)st.size());
}
cout<<ans;
}