题目:

给定n个A和2n个B。用这些字符拼成一个字符串。要求这个串的全部前缀和后缀B的个数始终不少于A。

(一个字符串的前缀是仅仅从开头到某个位置为止的子串,后缀是仅仅从某个位置到结尾的子串)。

输入格式

多组数据。每组数据仅仅有一行,包括一个正整数n。

(n<=10^17)。

输出格式

每组数据输出一行,终于结果对99991取余数的结果。

分析:

简单的想法是建立一个二叉树。深度遍历一下就可以。

可是效率太低,对照较大的n不太适用,临时没想到什么好办法。先简单的做做看。

代码:

  1. <span style="font-size:18px;">#include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct Node {
  5. int value;
  6. struct Node *left;
  7. struct Node *right;
  8. };
  9.  
  10. #define n 3
  11. static int result = 0;
  12. static int index = 0;
  13. static int array[3 * n] = {0};
  14.  
  15. struct Node* initNode()
  16. {
  17. struct Node* temp = (struct Node *)malloc(sizeof(struct Node));
  18. temp->value = 0;
  19. temp->left = NULL;
  20. temp->right = NULL;
  21. return temp;
  22. }
  23.  
  24. void creatTree(struct Node* parent, int a, int b)
  25. {
  26. if (a > 0)
  27. {
  28. struct Node* left = initNode();
  29. left->value = -1;
  30. parent->left = left;
  31. creatTree(left, a - 1, b);
  32. }
  33. if (b > 0)
  34. {
  35. struct Node* right = initNode();
  36. right->value = 1;
  37. parent->right = right;
  38. creatTree(right, a, b - 1);
  39. }
  40. if (a <= 0 && b <=0)
  41. {
  42. return;
  43. }
  44. }
  45.  
  46. //static int array[100] = {0};
  47.  
  48. void dfs(struct Node* root, int sum)
  49. {
  50. int i = 0;
  51. if (root == NULL)
  52. {
  53. //result++;
  54. return;
  55. }
  56.  
  57. if (root->value == 1 && root->left == NULL && root->right == NULL)
  58. {
  59. result++;
  60. printf("%d\n", root->value);
  61. printf("\nget one\n");
  62. return;
  63. }
  64.  
  65. sum += root->value;
  66.  
  67. if (sum < 0 || sum > n)
  68. {
  69. return;
  70. }
  71. else
  72. {
  73. printf("%d\n", root->value);
  74. //index = 0;
  75. dfs(root->left, sum);
  76. dfs(root->right, sum);
  77. }
  78.  
  79. }
  80.  
  81. void freeNode(struct Node* root)
  82. {
  83. if (root != NULL)
  84. {
  85. //printf("%d\n", root->value);
  86. //printf("%d\n", root->left->value);
  87. freeNode(root->left);
  88. freeNode(root->right);
  89. free(root);
  90. }
  91. return;
  92. }
  93.  
  94. int main()
  95. {
  96. int a = 0, b = 0, sum = 0;
  97. a = n;
  98. b = n * 2;
  99.  
  100. /* 根节点 B */
  101. struct Node *root = initNode();
  102. root->value = 1;
  103.  
  104. /* 建立二叉树 */
  105. creatTree(root, a, b-1);
  106.  
  107. /* 深度搜索遍历法得到结果 */
  108. dfs(root, sum);
  109. printf("result = %d\n", result);
  110.  
  111. /* 释放内存 */
  112. freeNode(root);
  113. return 0;
  114. }
  115. </span>

AB串的更多相关文章

  1. AB串(上帝都不会,我就没救了)

    [题目分析] 设答案的长度为m,

  2. 数据结构(三)串---KMP模式匹配算法

    (一)定义 由于BF模式匹配算法的低效(有太多不必要的回溯和匹配),于是某三个前辈发表了一个模式匹配算法,可以大大避免重复遍历的情况,称之为克努特-莫里斯-普拉特算法,简称KMP算法 (二)KMP算法 ...

  3. Codeforces 划水

    Codeforces 566F 题目大意:给定$N$个数,任意两个数之间若存在一个数为另一个数的因数,那么这两个数存在边,求图中最大团. 分析:求一个图最大团为NP-Hard问题,一般不采用硬方法算. ...

  4. BZOJ 3160: 万径人踪灭

    Description 一个ab串,问有多少回文子序列,字母和位置都对称,并且不连续. Sol FFT+Manacher. 不连续只需要减去连续的就可以了,连续的可以直接Manacher算出来. 其他 ...

  5. Hackerrank11 LCS Returns 枚举+LCS

    Given two strings,  a and , b find and print the total number of ways to insert a character at any p ...

  6. POJ 3415 后缀数组

    题目链接:http://poj.org/problem?id=3415 题意:给定2个串[A串和B串],求两个串公共子串长度大于等于k的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...

  7. poj3415

    很久以前写的,忘补结题报告了两串相连中间用特殊的分隔符然后求height,由于要求求公共子串大于等于k的个数,并且只要位置不同即可因此不难想到在名次上对height分组,一组内的height保证> ...

  8. Codeforces - ZeptoLab Code Rush 2015 - D. Om Nom and Necklace:字符串

    D. Om Nom and Necklace time limit per test 1 second memory limit per test 256 megabytes input standa ...

  9. UVALive 5792 Diccionário Portuñol

    字符串匹配问题 有n个a串个m个b串,讲a的前缀和b的后缀粘在一起有多少个不同的新串. 首先求不同的前缀和后缀肯定好求了,就用字典树分别存一下a个倒过来的b. 那个问题就是解决例如,abcd,和bcd ...

随机推荐

  1. Cache 和 Buffer 都是缓存,主要区别是什么?

    存储器的高速缓冲存储器存储了频繁访问的RAM位置的内容及这些数据项的存储地址.当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址.如果存有该地址,则将数据返回处理器;如果没有保存该地址 ...

  2. Linux网络中接收 "二进制" 流的那些事 --- 就recv的返回值和strlen库函数进行对话

    1.    前言 很多朋友在做网络编程开发的时候可能都遇到这样的问题,在进行接收二进制流的数据的时候,使用strlen库函数来得到 二进制数据长度的时候并不准确.为什么呢??首先,使用strlen进行 ...

  3. 四:java调接口实现发送手机短信验证码功能

    1.点击获取验证码之前的样式: 2.输入正确的手机号后点击获取验证码之后的样式: 3.如果手机号已经被注册的样式: 4.如果一个手机号一天发送超过3次就提示不能发送: 二:前台的注册页面的代码:reg ...

  4. Oracle.ManagedDataAccess.dll 连接Oracle数据库不需要安装客户端

    最开始,连接Oracle 数据是需要安装客户端的,ado.net 后来由于微软未来不再支持 System.Data.OracleClient 这个 Data Provider 的研发,从 .NET 4 ...

  5. TextView SpannableString 使用之实现可点击超链接效果

    TextView SpannableString 使用之实现可点击超链接效果 如果看到这里说明你对 TextView 已经有了一定的了解,至少已经使用过该控件显示文字过.现在来实现一些复杂一点的效果. ...

  6. Python返回Json格式定义的例子

    { "code": 0, // code为0表示成功,否则为1 "message": null, "data": { "syscp ...

  7. MSSQL-并发控制-1-Transaction

         MSSQL并发控制原先打算分为两个部分写:隔离级别及锁,写的过程中,发现需要提及下事务的相关内容,故加多一篇博文,共3篇.         如果转载,请注明博文来源: www.cnblogs ...

  8. SpringMVC 视图解析器

    SpringMVC 视图解析器 还记得SpringMVC 快速入门中,dispatcher-servlet.xml 配置的视图解析器么.它是SpringMVC 的核心知识点.本章节比较简单,明白视图解 ...

  9. Java中常用加减密方式

    1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概 ...

  10. SQL Server 结构分解

    关系引擎和存储引擎是SQL Server 的两大组件,其中关系引擎也叫查询处理器,它包括查询优化器.命令解析器.查询执行器.存储引擎管理所有的数据及涉及的IO,它包括事务管理器和数据访问方法和缓冲区管 ...