先输入n个字符串的字典,每个字符串的前缀+后缀可以组成新的合法字符串,但肯定是有重复的,问从给定的字符串,生成的所有可能的字符串为多少个

把前缀和后缀压入字典树,达到前缀和后缀的去重,首先的总和即为前缀数目乘以后缀数目,之后为了去重,记录每个前后缀非第一个相同的每个字母,则每个相同字母必定会产生重复。减掉即可。。还要注意,len=1的字符串特判。。注意细节处理

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define LL long long
  6. using namespace std;
  7. int n;
  8. LL sum1,sum2;
  9. LL num1[26],num2[26];
  10. struct node
  11. {
  12. int ch[400000][26];
  13. int cnt;
  14. void init()
  15. {
  16. memset(ch,0,sizeof ch);
  17. cnt=1;
  18. }
  19. void inserts(char* str)
  20. {
  21. int rt=0;
  22. int k=0;
  23. while (str[k])
  24. {
  25. int q=str[k]-'a';
  26. if (ch[rt][q]==0){
  27. ch[rt][q]=cnt++;
  28. sum1++;
  29. if (k>0) num1[q]++;
  30. }
  31. rt=ch[rt][q];
  32. k++;
  33. }
  34. }
  35. void inserts2(char* str)
  36. {
  37. int rt=0;
  38. int k=0;
  39. while (str[k])
  40. {
  41. int q=str[k]-'a';
  42. if (ch[rt][q]==0){
  43. ch[rt][q]=cnt++;
  44. sum2++;
  45. if (k>0) num2[q]++;
  46. }
  47. rt=ch[rt][q];
  48. k++;
  49. }
  50. }
  51. }T1,T2;
  52. char s[50];
  53. int len;
  54. int one[26];
  55. int main()
  56. {
  57.  
  58. while (scanf("%d",&n)!=EOF)
  59. {
  60. T1.init();
  61. T2.init();
  62. sum1=sum2=0;
  63. memset(one,0,sizeof one);
  64. memset(num1,0,sizeof num1);
  65. memset(num2,0,sizeof num2);
  66. for (int i=0;i<n;i++){
  67. scanf("%s",s);
  68. T1.inserts(s);
  69. len=strlen(s);
  70. if (len==1) {one[s[0]-'a']=1;}
  71. reverse(s,s+len);
  72. T2.inserts2(s);
  73. }
  74. LL ans=sum1*sum2;
  75. //cout<<sum1<<" "<<sum2<<endl;
  76. for (int i=0;i<26;i++){
  77. if (one[i]) ans++;
  78. ans-=num1[i]*num2[i];
  79. }
  80. printf("%lld\n",ans);
  81. }
  82. return 0;
  83. }

  

UVALive 5913 字典树的更多相关文章

  1. UVALive 5029 字典树

    E - Encoded Barcodes Crawling in process...Crawling failedTime Limit:3000MS    Memory Limit:0KB    6 ...

  2. UVALive 3942 字典树+dp

    其实主要是想学一下字典树的写法,但这个题目又涉及到了DP:这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到. ...

  3. UVALive 7712 Confusing Manuscript 字典树 查询与s的编辑距离为1的字符串数量

    /** 题目:UVALive 7712 Confusing Manuscript 链接:https://vjudge.net/problem/UVALive-7712 题意:给定n个不同的字符串,f( ...

  4. UVALive 3942 Remember the Word 字典树+dp

    /** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5) ...

  5. UVALive 3942 Remember the Word(字典树+DP)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  6. UVALive - 3942 (字典树)

    递推:$d(i) $表示从第$i$个字符开始到末尾的字符串(即后缀S[i...n])的分解方案数,则$d(i) = \sum {d(i + len(x))} $,其中字符串$x$代表S[i...n]的 ...

  7. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  8. [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  9. 字典树+博弈 CF 455B A Lot of Games(接龙游戏)

    题目链接 题意: A和B轮流在建造一个字,每次添加一个字符,要求是给定的n个串的某一个的前缀,不能添加字符的人输掉游戏,输掉的人先手下一轮的游戏.问A先手,经过k轮游戏,最后胜利的人是谁. 思路: 很 ...

随机推荐

  1. less在vscode中的配置方式

    1.在vscode插件中下载easy less这个插件. 2.新建项目,分别建两个文件夹存放less和自动编译好的css,页面中引入文件引css就可以了. 3.根据你的文件位置,在用户设置中设置需要配 ...

  2. SQL注入的原理及分析

    注入攻击的本质:将用户输入的数据当做代码执行. 有2个限制条件: 1.用户能够控制输入. 2.原本程序要执行的代码,拼接了用户输入的数据后进行执行. 定义:用户输入的数据被当做SQL语句执行. 以下面 ...

  3. 虚拟机下安装win7

    参考博客:https://blog.csdn.net/weixin_43465312/article/details/92662519 下载地址:https://msdn.itellyou.cn/

  4. Windows驱动开发-DeviceIoControl函数参数dwIoControlCode

    函数语法 BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBuffer ...

  5. ROS常用库(三)API学习之常用common_msgs(上)

    一.概述 common_msgs包含其他ROS软件包广泛使用的消息.这些消息包括动作消息(actionlib_msgs),诊断消息(diagnostic_msgs),几何图元(geometry_msg ...

  6. docker学习笔记-03:docker的镜像原理

    镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件.它包含运行某个环境所需的所有内容,包括代码.库.环境变量和配置文件. 一.镜像是什么 (一).联合文件系统(Unio ...

  7. JDK8~JDK11的新特性

    #JDK 1.8 新特性接口中的静态方法 只能由接口自己调用 接口中的默认方法 可以不被覆盖 #JDK 1.9 新特性(可能在JDK8中被忽略了,没来得及加)接口可以定义私有方法,但是只能让自己调用, ...

  8. Day7 - E - Strange Way to Express Integers POJ - 2891

    Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative ...

  9. 007、MySQL日期取当前时间,取昨天

    #取今天文本格式 SELECT DATE_SUB( curdate( ), INTERVAL DAY ); #取昨天文本格式 SELECT DATE_SUB( curdate( ), INTERVAL ...

  10. 原生JS 实现 dom ready

    记录一下项目技术问题: 记得:放在head标签内的脚本,第一时间执行 var baseTools = { // dom ready ready: function( f ){ var ie = !!( ...