• POJ2406 Power Strings 【KMP】


    Power Strings
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 31388   Accepted: 13074

    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.

    题意:给定一个串,它一定是某个前缀反复K次组成的。求K的最大值。

    题解:利用next数组求最小循环节点len-next[len],注意还需推断len是否能整除这个节点,若不能,那么k==1,否则k==len/最小循环节点。


    #include <stdio.h>
    #define maxn 1000002
    
    char str[maxn];
    int next[maxn], len, cir;
    
    void getNext()
    {
    	int i = 0, j = -1;
    	next[0] = -1;
    	while(str[i]){
    		if(j == -1 || str[i] == str[j]){
    			++i; ++j;
    			next[i] = j; //mode 1
    		}else j = next[j];
    	}
    	len = i;
    }
    
    int main()
    {
    	//freopen("stdin.txt", "r", stdin);
    	while(scanf("%s", str) == 1){
    		if(str[0] == '.') break;
    		getNext();
    		cir = len - next[len];
    		if(len % cir != 0) printf("1
    ");
    		else printf("%d
    ", len / cir);
    	}
    	return 0;
    }


  • 相关阅读:
    Python爬虫之Scrapy框架的简介和基础应用
    python爬虫之selenium,谷歌无头浏览器
    12.块设备驱动程序(磁盘)
    11.USB输入子系统
    10.触摸屏驱动
    9.LCD驱动架构
    8.platform驱动分离
    7.输入子系统框架
    5.标签管理
    4.分支管理
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7110945.html
Copyright © 2020-2023  润新知