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 }
  • 相关阅读:
    Cable master--hdu1551(二分法)
    Pie--hdu1969(二分法)
    Ice_cream's world I--hdu2120
    How Many Tables--hdu1213(并查集)
    畅通工程--hdu1232(并查集)
    小希的迷宫--hdu1272(并查集)
    More is better--hdu1856(并查集)
    Windows Message Queue--hdu1509
    期末考试--nyoj-757
    网络开发之使用Web Service和使用WCF服务
  • 原文地址:https://www.cnblogs.com/XBWer/p/2669823.html
Copyright © 2011-2022 走看看