• 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;
    }


  • 相关阅读:
    树莓派3下开启SSH服务
    没有显示器连接树莓派
    没有屏幕和键盘如何玩转树莓派
    无显示器通过网线连接笔记本电脑玩转树莓派
    解决某些软件无法在虚拟机中运行的方法
    sql注入-基于布尔型的盲注入门
    前台数据传到后台,日期类型序列化后与前台传过来的数据不一致
    layui修改表格行高
    jQuery动态回到顶部
    禁止选中页面内容
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7110945.html
Copyright © 2020-2023  润新知