zoukankan      html  css  js  c++  java
  • POJ2406 Power Strings[求最长重复字串]

    Power Strings
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 23735   Accepted: 9978

    Description

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

    Input

    Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

    Output

    For each s you should print the largest n such that s = a^n for some string a.

    Sample Input

    abcd
    aaaa
    ababab
    .
    

    Sample Output

    1
    4
    3
    

    Hint

    This problem has huge input, use scanf instead of cin to avoid time limit exceed.

    Source

     
     
     
    题意:给出一个字符串S,求该字符串最多是由相同重复字串连接而成的
    若S由n个A组成,则称 S = A^n,求最大的n
      如 S=aaa,S="a"^3 => n = 3;
         S=ababa =>  n = 1
    S=ababab=>"ab"^3=>n=3


     
    code:
     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 int Next[1000010];
     6 char str[1000010];
     7 int len;
     8 
     9 void getnext()
    10 {
    11     int j=0;
    12     int k=-1;
    13     Next[0]=-1;
    14     while(j<len)
    15     {
    16         if(k==-1||str[k]==str[j])
    17         {
    18             k++;
    19             j++;
    20             Next[j]=k;
    21         }
    22         else
    23             k=Next[k];
    24     }
    25 }
    26 
    27 int main()
    28 {
    29     int ans;
    30     while(~scanf("%s",str))
    31     {
    32         if(str[0]=='.')
    33             break;
    34         len=strlen(str);
    35         getnext();        
    36         if(len%(len-Next[len])==0)
    37         {
    38             ans=len/(len-Next[len]);
    39             printf("%d\n",ans);
    40             continue;
    41         }
    42         printf("1\n");
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    6 网络爬虫引发的问题及Robots协议
    WEB测试方法总结-笔记(转)
    最全的Http协议、get和post请求的整理
    random()函数的应用---面试
    求两个列表的交集、差集、并集---面试
    python中函数参数传递--引用传递(面试)
    linux重定向命令>和>>---面试
    正则表达式re.findall和re.search的使用---面试
    关于可迭代对象的详解
    sorted()函数排序的灵活运用---面试
  • 原文地址:https://www.cnblogs.com/XBWer/p/2669823.html
Copyright © 2011-2022 走看看