1. 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA BB 是任意非空字符串,则我们称该字符串的这种拆分是优秀的。
  2.  
  3. 例如,对于字符串 aabaabaa,如果令 A=aabA=aabB=aB=a,我们就找到了这个字符串拆分成 AABBAABB 的一种方式。
  4.  
  5. 一个字符串可能没有优秀的拆分,也可能存在不止一种优秀的拆分。比如我们令 A=aA=aB=baaB=baa,也可以用 AABBAABB 表示出上述字符串;但是,字符串 abaabaa 就没有优秀的拆分。
  6.  
  7. 现在给出一个长度为 nn 的字符串 SS,我们需要求出,在它所有子串的所有拆分方式中,优秀拆分的总个数。这里的子串是指字符串中连续的一段。
  8.  
  9. 以下事项需要注意:
  10.  
  11. 出现在不同位置的相同子串,我们认为是不同的子串,它们的优秀拆分均会被记入答案。
  12. 在一个拆分中,允许出现 A=BA=B。例如 cccc 存在拆分 A=B=cA=B=c
  13. 字符串本身也是它的一个子串。
  14. 输入格式
  15. 每个输入文件包含多组数据。输入文件的第一行只有一个整数 TT,表示数据的组数。保证 T≤≤T≤。
  16.  
  17. 接下来 TT 行,每行包含一个仅由英文小写字母构成的字符串 SS,意义如题所述。
  18.  
  19. 输出格式
  20. 输出 TT 行,每行包含一个整数,表示字符串 SS 所有子串的所有拆分中,总共有多少个是优秀的拆分。
  21.  
  22. 样例一
  23. input
  24.  
  25. aabbbb
  26. cccccc
  27. aabaabaabaa
  28. bbaabaababaaba
  29.  
  30. output
  31.  
  32. explanation
  33.  
  34. 我们用 S[i,j]S[i,j] 表示字符串 SS ii 个字符到第 jj 个字符的子串(从 开始计数)。
  35.  
  36. 第一组数据中,共有 个子串存在优秀的拆分:
  37.  
  38. S[,]=aabbS[,]=aabb,优秀的拆分为 A=aA=aB=bB=b
  39.  
  40. S[,]=bbbbS[,]=bbbb,优秀的拆分为 A=bA=bB=bB=b
  41.  
  42. S[,]=aabbbbS[,]=aabbbb,优秀的拆分为 A=aA=aB=bbB=bb
  43.  
  44. 而剩下的子串不存在优秀的拆分,所以第一组数据的答案是
  45.  
  46. 第二组数据中,有两类,总共 个子串存在优秀的拆分:
  47.  
  48. 对于子串 S[,]=S[,]=S[,]=ccccS[,]=S[,]=S[,]=cccc,它们优秀的拆分相同,均为 A=cA=cB=cB=c,但由于这些子串位置不同,因此要计算 次;
  49.  
  50. 对于子串 S[,]=ccccccS[,]=cccccc,它优秀的拆分有 种:A=cA=cB=ccB=cc A=ccA=ccB=cB=c,它们是相同子串的不同拆分,也都要计入答案。
  51.  
  52. 所以第二组数据的答案是 +=+=。
  53.  
  54. 第三组数据中,S[,]S[,] S[,]S[,] 各有 种优秀的拆分,其中 S[,]S[,] 是问题描述中的例子,所以答案是 +=+=。
  55.  
  56. 第四组数据中,S[,]S[,],S[,]S[,],S[,]S[,],S[,]S[,],S[,]S[,] 各有 种优秀的拆分,S[,]S[,] 种优秀的拆分,所以答案是 +=+=。
  57.  
  58. 样例二
  59. 见样例数据下载。
  60.  
  61. 样例三
  62. 见样例数据下载。
  63.  
  64. 限制与约定
  65. 对于全部的测试点,保证 T≤≤T≤。以下对数据的限制均是对于单组输入数据而言的,也就是说同一个测试点下的 TT 组数据均满足限制条件。
  66.  
  67. 我们假定 nn 为字符串 SS 的长度,每个测试点的详细数据范围见下表:
  68.  
  69. 测试点编号 nn 其他约束
  70. ≤≤ SS中所有字符全部相同
  71. ≤≤
  72. ≤≤
  73. ≤≤
  74. ≤≤
  75. ≤≤
  76. ≤≤
  77. ≤≤
  78. ≤≤
  79. ≤≤
  80. ≤≤
  81. ≤≤
  82. ≤≤
  83. 时间限制:.5s1.5s
  84. 空间限制:512MB

题干

哈哈,第一次啥都没看就独立完成了一道不水的题(虽然只有95分)。

希望考试时也能这样(部分分也是很重要的)。

好吧说一下思路:

  首先每得到一个新的字符串,先预处理两个数组ok[i][j],b[i],分别表示,从i到 j是否是两个相同的字符串(也就是是否存在AA)。和以i开头有几个相连的相同字符串(也就是有几个BB)

  然后n^2扫一遍 ans+=(ok[i][j])*b[j];  就ok了

  

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<math.h>
  6. #include<cstdio>
  7. using namespace std;
  8. #define LL unsigned long long
  9. #define MOD 1000000007
  10. #define base 211
  11. LL n,b[],ha[][];
  12. char s[];
  13. int T;
  14. bool ok[][];
  15. void first()
  16. {
  17. for(int i=;i<=n;i++)
  18. for(int j=i;j<=n;j++)
  19. ha[i][j]=(ha[i][j-]*base+(LL)s[j])%MOD;
  20. }
  21. int main( )
  22. {
  23. scanf("%d",&T);
  24. while(T--)
  25. {
  26. cin>>(s+);
  27. memset(ok,,sizeof(ok));
  28. memset(b,,sizeof(b));
  29. memset(ha,,sizeof(ha));
  30.  
  31. n=strlen(s+);first();
  32. for(int i=;i<=n;i++)
  33. for(int l=;i+l+l-<=n;l++)
  34. if(ha[i][i+l-]==ha[i+l][i+l*-])
  35. ok[i][i+l+l-]=,b[i]++;
  36.  
  37. LL ans=;
  38. for(int i=;i<=n;i++)
  39. for(int l=;l+i-<=n;l++)
  40. if(ok[i][i+l-]) ans+=b[i+l];
  41. cout<<ans<<endl;
  42. }
  43. return ;
  44. }

  

#219. 【NOI2016】优秀的拆分的更多相关文章

  1. [UOJ#219][BZOJ4650][Noi2016]优秀的拆分

    [UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀 ...

  2. [NOI2016]优秀的拆分&&BZOJ2119股市的预测

    [NOI2016]优秀的拆分 https://www.lydsy.com/JudgeOnline/problem.php?id=4650 题解 如果我们能够统计出一个数组a,一个数组b,a[i]表示以 ...

  3. luogu1117 [NOI2016]优秀的拆分

    luogu1117 [NOI2016]优秀的拆分 https://www.luogu.org/problemnew/show/P1117 后缀数组我忘了. 此题哈希可解决95分(= =) 设\(l_i ...

  4. 【BZOJ4560】[NOI2016]优秀的拆分

    [BZOJ4560][NOI2016]优秀的拆分 题面 bzoj 洛谷 题解 考虑一个形如\(AABB\)的串是由两个形如\(AA\)的串拼起来的 那么我们设 \(f[i]\):以位置\(i\)为结尾 ...

  5. [NOI2016]优秀的拆分(SA数组)

    [NOI2016]优秀的拆分 题目描述 如果一个字符串可以被拆分为 \(AABB\) 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 \(aabaaba ...

  6. 题解-NOI2016 优秀的拆分

    NOI2016 优秀的拆分 \(T\) 组测试数据.求字符串 \(s\) 的所有子串拆成 \(AABB\) 形式的方案总和. 数据范围:\(1\le T\le 10\),\(1\le n\le 3\c ...

  7. [NOI2016]优秀的拆分 后缀数组

    题面:洛谷 题解: 因为对于原串的每个长度不一定等于len的拆分而言,如果合法,它将只会被对应的子串统计贡献. 所以子串这个限制相当于是没有的. 所以我们只需要对于每个位置i求出f[i]表示以i为开头 ...

  8. [BZOJ]4650: [Noi2016]优秀的拆分

    Time Limit: 30 Sec  Memory Limit: 512 MB Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串, ...

  9. [Noi2016]优秀的拆分

    来自F allDream的博客,未经允许,请勿转载,谢谢. 如果一个字符串可以被拆分为 AABB 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aab ...

  10. 【刷题】BZOJ 4650 [Noi2016]优秀的拆分

    Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆分是优秀的.例如,对于字符串 aabaabaa,如果令 A ...

随机推荐

  1. uboot配置和编译过程详解【转】

    本文转载自:http://blog.csdn.net/czg13548930186/article/details/53434566 uboot主Makefile分析1 1.uboot version ...

  2. HDU 2036:改革春风吹满地

    改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  3. receive和process的过程

    (一) receive最终在fuse_kern_chan.c中的fuse_kern_chan_receive函数实现,使用系统调用读取 res = read(fuse_chan_fd(ch), buf ...

  4. windows下运行swoole搭建环境

    swoole windows环境搭建 swoole框架是一个很神奇很厉害的框架,它弥补了PHP的本身的一些不足之处.其实swoole确切的说是一个使用C语言编写的PHP扩展,并且这个扩展不能够在win ...

  5. [Java] 读取文件

    1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如 ...

  6. 「LuoguP1799」 数列_NOI导刊2010提高(06)

    题目描述 虽然msh长大了,但她还是很喜欢找点游戏自娱自乐.有一天,她在纸上写了一串数字:1,1,2,5,4.接着她擦掉了一个l,结果发现剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位, ...

  7. Table View Programming Guide for iOS---(二)----Table View Styles and Accessory Views

    Table View Styles and Accessory Views 表格视图的风格以及辅助视图 Table views come in distinctive styles that are ...

  8. 038--HTML

    一.HTML的定义 1. 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 2. 浏览器按顺序渲染网 ...

  9. E20170507-ts

    prompt  n. 提示; 提示符 object    n. 物体; 目标; 宾语; asterisk  * n. 星号,星状物; Ampersand   & Slash   n. 斜线; ...

  10. Swift里计数相关的小细节

    Swift里对于字符串这些引入了index型,相对其他语言而言字符操作更安全了,但是问题就是一不注意搞错范围就会有各种离奇的bug. 在讲主题前,先说个小细节. Swift里非常严密的定义了一大堆字符 ...