zoukankan      html  css  js  c++  java
  • [poj2406] Power Strings

    Description

    对于两个字符串a,b定义a×b为将b接到a的末尾组成新的字符串。对于一个字符串a的幂运算的定义与我们在数学中的定义一样:a0=''(空字符),an+1=an×a

    Input

    输入数据每一行为一个字符串,长度为L(1<=L<=1000000)。输入数据以'.'结尾。

    Output

    对于每个字符串s,输出最大的n使得字符串s满足条件:s=an(a为一个字符串)

    Sample Input

    abcd

    aaaa

    ababab

    .

    Sample Output

    1

    4

    3

    Solution

    题意就是给你一个字符串,求这个字符串是为哪个子串循环而成的,要求子串循环的次数最大。

    因为是字符串,而且需要自我匹配,就会想到kmpnext[]

    然后通过一些模拟后发现,如果一个字符串s是有其长度为l的子串a循环而成的,则将s左移或右移l为后得到s's's在第1...n-l位依然重合(如下图)

    还有一个需要考虑的是,l必须为s的因数,否则无法形成s

    到这里,问题就基本解决了,具体细节参见代码。

     1 #include<set> 
     2 #include<cmath>
     3 #include<ctime>
     4 #include<queue>
     5 #include<stack>
     6 #include<cstdio>
     7 #include<vector> 
     8 #include<string>
     9 #include<cstring>
    10 #include<cstdlib>
    11 #include<iostream>
    12 #include<algorithm>
    13 #define N 1000002
    14 using namespace std;
    15 int next[N],l[N],n,ans;
    16 char a[N];
    17 inline void get_next(){
    18     for(int i=2,j=0;i<=n;i++){
    19         while(j&&a[i]!=a[j+1]) j=next[j];
    20         j+=(a[i]==a[j+1]);
    21         next[i]=j;
    22     } 
    23 }
    24 inline bool chk(int k){
    25     return !(n%(n-k));
    26 }
    27 inline void init(){
    28     while(true){
    29         scanf("%s",a+1);
    30         n=strlen(a+1);
    31         if(n==1&&a[1]=='.') break;
    32         fill(next+1,next+1+n,0);
    33         get_next();
    34         for(ans=next[n];ans;ans=next[ans])
    35             if(chk(ans)) break;
    36         ans=n-ans; 
    37         printf("%d
    ",n/ans);
    38     }
    39 }
    40 int main(){
    41     freopen("pow.in","r",stdin);
    42     freopen("pow.out","w",stdout);
    43     init();
    44     fclose(stdin);
    45     fclose(stdout);
    46     return 0;
    47 }

     

  • 相关阅读:
    常见Linux命令学习
    文件扩展名是什么?有什么用?通俗易懂的文件扩展名讲解!
    Xshell 6访问VMware Workstation Pro的虚机 CentOS 7
    Linux 常见目录
    集群
    MySQL问题记录——导入导出权限设置
    刷脸支付袭来,WeChat Pay &amp; AliPay争宠,究竟谁能笑到最后?
    Linux学习Day3:新手必须掌握的Linux命令(二)
    linux目录结构详解
    linux入门系列15--文件传输之vsftp服务
  • 原文地址:https://www.cnblogs.com/AireenYe/p/5583584.html
Copyright © 2011-2022 走看看