http://uoj.ac/problem/13

建立trie树,然后建立go指针,

和AC自动机里的fail指针差不多,

走到一个快捷方式就从go指针走。

注意在trie树上要保留字符'/',不能用end标记来标识一个字符串的结束。

因为可能出现"/Iam/zz"和"/Iamzz"这两种情况,如果只用end标记,tire树上这两个字符串就会共用一条路径。

(总之是蒟蒻才会犯的错误,神犇们勿喷_(:з」∠)_)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int in() {
int k = 0; char c = getchar();
for(; c < '0' || c > '9'; c = getchar());
for(; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - 48;
return k;
} struct State {
int num;
State *nxt[27], *go, *fa;
State(State *_fa, int _num) {
memset(nxt, 0, sizeof(nxt));
go = 0; fa = _fa; num = _num;
}
} *root; State *to(char *c) {
int len = strlen(c), x;
if (len == 1 && c[0] == '/') return root;
State *tmp = root;
for(int i = 0; i < len; ++i) {
if (c[i] == '/') x = 26;
else x = c[i] - 'a';
if (tmp->nxt[x] == 0)
tmp->nxt[x] = new State(tmp, x);
tmp = tmp->nxt[x];
if ((c[i + 1] == '\0' || c[i + 1] == '/') && tmp->go)
tmp = tmp->go;
}
return tmp;
} char s[500003], t[500003]; void print(State *tmp) {
int tot = 0;
if (tmp == root) {puts("/"); return;}
while (tmp != root) {
if (tmp->num <= 25) t[++tot] = 'a' + tmp->num;
else t[++tot] = '/';
tmp = tmp->fa;
}
while (tot) putchar(t[tot--]);
puts("");
} int n, m; int main() {
root = new State(0, 0);
n = in(); m = in();
for(int i = 1; i <= n; ++i) {
scanf("%s", s); scanf("%s", t);
to(s)->go = to(t);
}
for(int i = 1; i <= m; ++i) {
scanf("%s", s);
print(to(s));
}
return 0;
}

最新文章

  1. Android自定义九宫格图案解锁
  2. HT for Web基于HTML5的图像操作(三)
  3. java中实现定时功能
  4. replace和replaceAll(路径反斜杠问题)
  5. JS window.open()属性
  6. wcf Svcutil用法
  7. cocos2dx Sprite setBlendFunc 使用颜色混合:加算,减算
  8. &quot;只能在执行Render()的过程中调用RegisterForEventValidation&quot; 解决方案
  9. 项目属性--&gt;生成事件--&gt;后期生成事件命令行
  10. struts2的工作机制
  11. SQL Common Sense 碎片一
  12. MongoDB高级操作
  13. Hadoop(十七)之MapReduce作业配置与Mapper和Reducer类
  14. SAP 查询分析器,查询报表自动生成,SQL查询测试实现说明(转)
  15. 7-10 多项式A除以B (25 分)
  16. Docker:使用自定义redis.conf运行redis容器(7)
  17. ThinkPHP框架 自定义 Empty 方法保护本地信息不被暴露!!!
  18. 集成学习二: Boosting
  19. 液晶电视插有线电视信号线的是哪个接口 HDMI是什么接口
  20. Linux watch命令详解

热门文章

  1. iOS 字典与JSON相互转换
  2. struts2默认配置文件 struts-default.xml
  3. TNS-12540: TNS:internal limit restriction exceeded
  4. 内存管理内幕mallco及free函数实现
  5. jar命令的用法详解
  6. centos 进度条卡死
  7. cefsharp设置网页接受语言Accept-Language
  8. 针对github权限导致hexo部署失败的解决方案
  9. 探索UDP套接字编程
  10. Machine Learning Algorithms Study Notes(6)—遗忘的数学知识