【题意】:

给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接。构成s串。如果有多个,请输出最多次数那个。

如:aaaa

可以用1个a,进行4次拼接

可以用2个a,进行2次拼接

可以用4个a,进行1次拼接


提供两种做法:

第一种是:利用kmp算法中求解  longest prefix table的方法,

找到最后一个位置的上的 p[len-1],如果用总长度减去(len-p[len-1])能否通过这一个前缀来拼接出来。

就是判断是否能整除。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e6 + ;
  4. char str[N];
  5. int p[N],len;
  6. void get_next(char s[]){
  7. len = strlen( s );
  8. int i = , j = ;
  9. p[] = ;
  10. while( i < len ){
  11. if( s[i] == s[j] ){
  12. p[i++] = ++j ;
  13. }else{
  14. if( j > ){
  15. j = p[j-] ;
  16. }else{
  17. p[i] = j ;
  18. i++ ;
  19. }
  20. }
  21. }
  22. }
  23. int main()
  24. {
  25. while( cin >> str ){
  26. if( str[] == '.' ) break;
  27. get_next( str );
  28. int len = strlen( str );
  29. printf("%d\n",len % (len-p[len-]) == ?
  30. len / (len-p[len-]) : );
  31. }
  32. return ;
  33. }

另一种方法就是:

用双hash来实现,双hash处理前缀和,最后用for循环,枚举所有的因数进行处理。

  1. #include<bits/stdc++.h>
  2. #define Mp make_pair
  3. #define F first
  4. #define S second
  5. using namespace std;
  6. const int N = 1e6+;
  7. const int M1 = 1e9+ , M2 = 1e9+;
  8. typedef long long ll;
  9. typedef struct Node{
  10. long long first ,second;
  11. Node (){}
  12. Node ( ll u,ll v){ first = u , second = v ;}
  13. }PII;
  14. //typedef pair<ll,ll> PII;
  15.  
  16. const PII base{M2,M1},p{M1,M2},One{1ll,1ll},Zero{0ll,0ll};
  17.  
  18. PII operator - (PII u,PII v){
  19. return Node( (u.first-v.first+p.first)%p.first ,(u.second-v.second+p.second)%p.second );
  20. }
  21. PII operator * ( PII u , PII v ){
  22. return Node( (u.first*v.first)%p.first , (u.second*v.second)%p.second );
  23. }
  24. PII operator + ( PII u , PII v ){
  25. return Node( (u.first+v.first)%p.first , (u.second+v.second)%p.second );
  26. }
  27. PII operator + ( PII u , int v ){
  28. return Node( (u.first+v)%p.first , (u.second+v)%p.second );
  29. }
  30. bool operator != ( PII u,PII v ){
  31. return !( u.first == v.first && u.second == v.second );
  32. }
  33. PII Pow( PII a ,int b){
  34. PII ans = One ;
  35. while( b ){
  36. if( b& )
  37. ans = ans * a ;
  38. b >>= ;
  39. a = a * a ;
  40. }
  41. return ans ;
  42. }
  43. PII sum[N];
  44. char str[N];
  45. int main()
  46. {
  47. ios_base :: sync_with_stdio();
  48. cin.tie(NULL),cout.tie(NULL);
  49.  
  50. while( cin >> str+ ){
  51. if( str[] == '.') break;
  52. int len = strlen(str+);
  53.  
  54. sum[] = Zero ;
  55. for(int i=;i<=len;i++)
  56. sum[i] = sum[i-] * base + str[i];
  57. int ans = ;
  58. for(int i=;i<=len/;i++){
  59. if( len % i ) continue ;
  60. bool flag = false ;
  61. for(int j=i ; !flag && j<=len; j+=i ){
  62. if( sum[j] - sum[j-i] * Pow(base,i) != sum[i] ){
  63. flag = true ;
  64. }
  65. }
  66. if( !flag ) {
  67. ans = len/i ;
  68. break;
  69. }
  70. }
  71. cout << ans << endl ;
  72. }
  73. return ;
  74. }

BKDR

【hash】Power Strings的更多相关文章

  1. 【POJ2406】 Power Strings (KMP)

    Power Strings Description Given two strings a and b we define a*b to be their concatenation. For exa ...

  2. 【POJ2406】【KMP】Power Strings

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

  3. 【题解】Power Strings

    题目描述 给定若干个长度小于等于10^6的字符串,询问每个字符串最多由多少个相同的子串重复连接而成.如:ababab,最多由3个ab连接而成. 输入输出格式 输入格式 若干行,每行一个字符串. 当读入 ...

  4. 【poj2406】 Power Strings

    http://poj.org/problem?id=2406 (题目链接) 题意 给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的, 求 R 的最大值. Solution 后 ...

  5. 【POJ2406】Power Strings(KMP,后缀数组)

    题意: n<=1000000,cas较大 思路:这是一道论文题 后缀数组已弃疗,强行需要DC3构造,懒得(不会)写 ..]of longint; n,m,i,j,len,ans,st:longi ...

  6. 【SPOJ】Power Modulo Inverted(拓展BSGS)

    [SPOJ]Power Modulo Inverted(拓展BSGS) 题面 洛谷 求最小的\(y\) 满足 \[k\equiv x^y(mod\ z)\] 题解 拓展\(BSGS\)模板题 #inc ...

  7. 【CF913G】Power Substring 数论+原根

    [CF913G]Power Substring 题意:T组询问,每次给定一个数a,让你求一个k,满足$2^k$的10进制的后$min(100,length(k))$位包含a作为它的子串.你只需要输出一 ...

  8. 【POJ 2406】 Power Strings

    [题目链接] 点击打开链接 [算法] KMP 如果字符串中存在循环节,则next[len] = (循环节个数 - 1) * 循环节长度 循环节个数 = len / (len - next[len]) ...

  9. 【poj 2406】Power Strings 后缀数组DC3模板 【连续重复子串】

    Power Strings 题意 给出一个字符串s,求s最多由几个相同的字符串重复而成(最小循环节的重复次数) 思路 之前学习KMP的时候做过. 我的思路是:枚举字符串的长度,对于当前长度k,判断\( ...

随机推荐

  1. 《Linux设备驱动程序》第三版 scull编译 Ubuntu18.04

    0 准备工作. 0.0 系统环境:Ubuntu18.04.1 amd64. 0.1 安装必要软件包 1 sudo apt install build-essential bison flex libs ...

  2. Understanding glibc malloc

    https://wooyun.js.org/drops/深入理解%20glibc%20malloc.html https://sploitfun.wordpress.com/2015/02/10/un ...

  3. TreeFrog Framework : High-speed C++ MVC Framework for Web Application http://www.treefrogframework.org

    TreeFrog Framework : High-speed C++ MVC Framework for Web Application http://www.treefrogframework.o ...

  4. PostgreSQL 登录时在命令行中输入密码

    有时候需要设置定时任务直接执行 sql 语句,但是 postgresql 默认需要人工输入密码,以下命令可以直接在命令行中直接填入密码 PGPASSWORD=pass1234 psql -U MyUs ...

  5. [转][linux][centos]嵌入式 Linux下编译并使用curl静态库

    #x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...

  6. 0.9.0.RELEASE版本的spring cloud alibaba nacos+gateway网关实例

    gateway就是用来替换zuul的,功能都差不多,我们看下它怎么来跟nacos一起玩.老套路,三板斧: 1.pom: <?xml version="1.0" encodin ...

  7. Unity3d基于Socket通讯例子(转)

    按语:按照下文,服务端利用网络测试工具,把下面客户端代码放到U3D中摄像机上,运行结果正确. http://www.manew.com/thread-102109-1-1.html 在一个网站上看到有 ...

  8. 【esp8266】技术汇总帖

    https://blog.csdn.net/xh870189248/article/details/80027961 这哥们 牛

  9. Android Butterknife使用方法总结 IOC框架

    前言: ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神J ...

  10. 随机采样一致算法RANSAC

    A project to learn line, circle and ellipse detection in 2d images: https://github.com/Yiphy/Ransac- ...