题目大意:

  有n个字符串,编号为1~n,求每一个字符串在其他字符串中以它为后缀的字符串中编号第k小的字符串的编号。

思路:

  将字符串倒过来建Trie,记录每个结尾节点的编号(可能会有重复,所以开一个vector记录)。再对trie树进行dfs序,记录结尾节点的子树区间。区间第k小,自然用可持久化线段树(由于权值就是id,所以不用离散化)。 注意:dfs序在遇到结尾节点时才++记录序号的变量cnt,而且相同串的dfs序号是一样的(就是说一个结尾节点可能包含好多个不同编号的串),左区间取最前的一个(比如dfs到x节点,编号为2,x节点存着两个串,那么它们的左区间都为2,而序号要加两次)

参考自:http://blog.csdn.net/xym_CSDN/article/details/51340321

代码:

  1. #include<vector>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #define M 500009
  6. using namespace std;
  7. vector <int> q[M];
  8. int cnt,trie[M][],num[M],com[M],out[M],dat[M],sum[M<<],lc[M<<],rc[M<<];
  9. char s[M];
  10.  
  11. void ins(int id,char *str)
  12. {
  13. int i,l=strlen(str),j=,k;
  14. for (i=l-;i>=;i--,j=trie[j][k])
  15. if (!trie[j][k=str[i]-'a']) trie[j][k]=++cnt;
  16. num[j]++; q[j].push_back(id);
  17. }
  18.  
  19. void dfs(int x)
  20. {
  21. int i;
  22. for (i=;i<num[x];i++) com[q[x][i]]=cnt+;
  23. for (i=;i<num[x];i++) dat[++cnt]=q[x][i];
  24. for (i=;i<;i++) if (trie[x][i]) dfs(trie[x][i]);
  25. for (i=;i<num[x];i++) out[q[x][i]]=cnt;
  26. }
  27.  
  28. void build(int l,int r,int cur,int _cur,int x)
  29. {
  30. sum[cur]=sum[_cur]+;
  31. if (l==r) return; int mid=l+r>>;
  32. if (x<=mid) lc[cur]=++cnt,rc[cur]=rc[_cur],build(l,mid,lc[cur],lc[_cur],x);
  33. else lc[cur]=lc[_cur],rc[cur]=++cnt,build(mid+,r,rc[cur],rc[_cur],x);
  34. }
  35.  
  36. int ask(int L,int R,int l,int r,int k)
  37. {
  38. if (L==R) return L;
  39. int mid=L+R>>,t=sum[lc[r]]-sum[lc[l]];
  40. if (t>=k) return ask(L,mid,lc[l],lc[r],k);
  41. else return ask(mid+,R,rc[l],rc[r],k-t);
  42. }
  43.  
  44. int main()
  45. {
  46. int n,i,x; scanf("%d",&n);
  47. for (i=;i<=n;i++) scanf("%s",s),ins(i,s);
  48. for (cnt=,dfs(),cnt=n+,i=;i<=n;i++) build(,n,i+,i,dat[i]);
  49. for (i=;i<=n;i++)
  50. {
  51. scanf("%d",&x);
  52. if (sum[out[i]+]-sum[com[i]]<x) printf("-1\n");
  53. else printf("%d\n",ask(,n,com[i],out[i]+,x));
  54. }
  55. return ;
  56. }

【bzoj3439】kpm的mc密码 题解的更多相关文章

  1. BZOJ3439: Kpm的MC密码

    3439: Kpm的MC密码 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 166  Solved: 79[Submit][Status] Descr ...

  2. BZOJ3439 Kpm的MC密码(可持久化trie)

    将串反过来就变成查询前缀了.考虑建一棵可持久化trie,查询时二分答案,均摊一下复杂度即为O(mlogn). #include<iostream> #include<cstdio&g ...

  3. 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树

    [BZOJ3439]Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当 ...

  4. 【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)

    3439: Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记 ...

  5. 【BZOJ】【3439】Kpm的MC密码

    Trie树/可持久化线段树 神题啊……搞了我一下午= =(其实第233个提交也是我的) 我一开始的思路:这个找kpm串的过程,其实就跟在AC自动机上沿fail倒着往下走是差不多的(看当前是哪些点的后缀 ...

  6. BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )

    把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...

  7. 【BZOJ3439】Kpm的MC密码 trie树+主席树

    Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身 ...

  8. 【bzoj3439】Kpm的MC密码 可持久化Trie树

    题目描述 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了. ...

  9. BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)

    背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了... 描述 ...

随机推荐

  1. JAVA作业)01

    一,四则运算 (一)  设计思想 使用Scanner类读取运行时用户输入数据,然后进行数据类型转换,完成四则运算之后利用输出类输出. (二)  流程图 (三)程序代码 //Zhangxiaochen ...

  2. ssh -v root@xxxxx 显示登录的细节

    [root@ok .ssh]# ssh -v root@10.100.2.84 OpenSSH_5.3p1, OpenSSL Feb debug1: Reading configuration dat ...

  3. Android - 控件android:ems属性

    Android - 控件android:ems属性http://blog.csdn.net/caroline_wendy/article/details/41684255?utm_source=tui ...

  4. Delphi中的变量作用域简介

    1.在函数或过程中声明的变量是局部变量,只能在函数或过程中使用 2.在单元的implementation部分声明的变量是单元级的(又称模块级.窗体级)变量,该单元的所有函数与过程都能使用,其他引用该单 ...

  5. Integer Inquiry【大数的加法举例】

    Integer Inquiry Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27730   Accepted: 10764 ...

  6. “init terminating in do_boot” Windows10 Rabbit MQ fails to start

    在Windows 10环境下安装rabbitmq-server-3.6.2后,CMD中运行命令:rabbitmq-plugins enable rabbitmq_management 报错: { , ...

  7. slf4i + logback 配置

    一.所需jar包: slf4j-api-1.6.1.jar logback-classic-0.9.24.jar logback-core-0.9.24.jar 二.logback.xml配置示例: ...

  8. Oracle备份及备份策略

    第二章. 了解备份的重要性 可以说,从计算机系统出世的那天起,就有了备份这个概念,计算机以其强大的速度处理能力,取代了很多人为的工作,但是,往往很多时候,它又是那么弱不禁风,主板上的芯片.主板电路.内 ...

  9. php抓取网页信息

    index.php <?php include_once 'simple_html_dom.php'; //获取html数据转化为对象 $html = file_get_html('http:/ ...

  10. thinkphp调用phpqrcode.php生成二维码

    thinkphp3. 把phpqrcode文件夹放在ThinkPHP\Library\Vendor\下面 phpqrcode下载: http://files.cnblogs.com/files/qho ...