1212: [HNOI2004]L语言

题目:传送门


题解:

   看完题目之后就觉得可以暴力在字典树上之间询问,一开始还傻了以为用文章来建,肯定用单词啊:

   那么我们可以用一个v数组表示当前字符串1~i的区间能够被覆盖,v[0]就初始化一下

   然后一开始就把位置挪到当前已经处理到的能覆盖的位置x,然后从x+1开始在字典树上跑,跑到一个单词的结尾就更新当前位置的v(即使单词有包含关系也没所谓,只要路过就会更新,找不到了才结束,那肯定跑到最后一个位置最优啊),然后重复操作(换一个单词)

   严重吐槽:说好的是字典,哪来的同样的单词???于是没有听企鹅的话...结果就WA了,膜一发捞niang发现他一开始和我一样傻...吐槽吐槽吐槽!!!


代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int c[],s;
node()
{
memset(c,-,sizeof(c));
s=;
}
}tr[];int cnt;
void bt(char *s,int root)
{
int x=root,len=strlen(s+);
for(int i=;i<=len;i++)
{
int y=s[i]-'a'+;
if(tr[x].c[y]==-)tr[x].c[y]=++cnt;
x=tr[x].c[y];
}
tr[x].s++;//有同样的单词...所以要++ ORZ
}
int n,m;
char s[],st[];
int v[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
bt(s,);
}
for(int i=;i<=m;i++)
{
scanf("%s",st+);int len=strlen(st+);
v[]=i;int x=,ans=;
while(x<=len)
{
while(v[x]!=i)
{
x++;
if(x==len+)break;
}
int r=;
for(int k=x+;k<=len;k++)
{
int y=st[k]-'a'+;
if(tr[r].c[y]==-)break;
else
{
r=tr[r].c[y];
if(tr[r].s>)v[k]=i;
}
}
x++;
}
for(int j=len;j>=;j--)if(v[j]==i){ans=j;break;}
printf("%d\n",ans);
}
return ;
}

最新文章

  1. Hive On Spark环境搭建
  2. (七)理解angular中的module和injector,即依赖注入
  3. Cocos2dx 把 glview 渲染到 Qt 控件上(Mac 环境)
  4. c#读取文本文档实践2-计算商品价格
  5. 协处理器CP15
  6. Android模拟器使用教程
  7. MSSQL数据库逻辑文件名修改与查看
  8. mysql快速上手2
  9. JAVA深复制(深克隆)与浅复制(浅克隆)
  10. python函数--传参
  11. PHP配置图文教程
  12. Ext4.1 tree grid的右键菜单
  13. MFC 操作控件数据
  14. JSON.stringify 语法解释
  15. IEEE1588协议简介
  16. php逐行读取txt文件写入数组的方法
  17. 开发高性能JAVA应用程序基础(集合篇)
  18. SSH 连接慢
  19. js中实现cookie的增删改查(document.cookie的使用详情)
  20. redis的高级事务CAS(乐观锁)

热门文章

  1. Linux以下基于TCP多线程聊天室(client)
  2. HDU 5672 String 尺取法追赶法
  3. Android 编程下获得应用程序的签名
  4. 数论TIPS(Loading...)
  5. 杂项-软件: VBA(Visual Basic for Applications)
  6. Centos上JDK的安装搭建
  7. Js radio
  8. TFS源代码管理工具:
  9. P1903 【模板】分块/带修改莫队(数颜色)
  10. 快速新建一个纯净的java pom项目 project