题目链接:https://www.rqnoj.cn/problem/429

题意:

  如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词链。

  如:i,int,integer.

  给你一堆按字典序排好的字符串,问你最长的词链有多长(词链中的字符串个数)。

题解:

  单调栈。

  

  找出单调性:

    对于栈内的元素,从栈底到栈顶为单调,形成一个词链。

  

  找出答案:

    扫一遍给出的字符串,栈的最大高度即为答案。

  维护单调性:

    因为字符串按字典序排好,已经达到了是单调性最优的状态(贪心证明),所以就不用管扫描顺序了。

    对于一个新扫到的字符串s[i]:

      (1)如果满足单调性,则入栈。

        即:1. 当前栈顶为s[i]的前缀(is_prefix(stk.top(),s[i]))。

          2. 当前栈为空。

      (2)如果不满足单调性,则弹出栈顶,直到满足单调性为止。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#define MAX_N 10005 using namespace std; int n;
int ans;
string s[MAX_N];
stack<string> stk; void read()
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>s[i];
}
} bool is_prefix(string sub,string dst)
{
if(sub.size()>dst.size()) return false;
for(int i=;i<sub.size();i++)
{
if(sub[i]!=dst[i]) return false;
}
return true;
} void solve()
{
ans=;
for(int i=;i<n;i++)
{
while(!stk.empty() && !is_prefix(stk.top(),s[i]))
{
stk.pop();
}
stk.push(s[i]);
ans=max(ans,(int)stk.size());
}
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}

最新文章

  1. servlet简单用法和配置示例及说明
  2. zendframework 2 链接数据库
  3. Hibernate学习笔记2
  4. NeuSoft(2)添加系统调用
  5. 为什么你还在用嵌入式的方式来使用mod_wsgi?
  6. python module getopt usage
  7. 微软职位内部推荐-SW Engineer for Skype
  8. Socket网络编程(3)--两端通信
  9. read 不回显的方法
  10. JavaScript类的设计
  11. 特殊的string类型
  12. 《Python编程从入门到实践》第二章_变量和简单数据类型
  13. DNS Server Centos 7
  14. N - Asteroids
  15. try 、catch 、finally 、throw 测试js错误
  16. 如何判断一个单向链表是否为回文链表(Palindrome Linked List)
  17. springboot工程添加404页面
  18. HDU 3091 - Necklace - [状压DP]
  19. PHP 生成Word文档
  20. 【搜索】POJ-3050 基础DFS

热门文章

  1. 路飞学城Python爬虫课第一章笔记
  2. Java集合框架GS Collections具体解释
  3. Java 使用StringBuffer注意
  4. request获取数据的几种方法
  5. Codeforces 223C Partial Sums 数论+组合数学
  6. 02-cookie案例-显示用户上次访问网站的时间
  7. Centos 7.0防火墙问题
  8. java 泛型小小的测试题
  9. 目标跟踪之粒子滤波---Opencv实现粒子滤波算法
  10. activiti自己定义流程之Spring整合activiti-modeler实例(六):启动流程