zoukankan      html  css  js  c++  java
  • #KMP ——Power Strings (POJ

    题目

    	给定两个字符串a和b,我们将a * b定义为它们的串联。
    	例如,如果a =“ abc”和b =“ def”,则a * b =“ abcdef”。
    	如果我们将串联视为乘法,则以非负整数进行乘幂运算的方式为:a ^ 0 =“”(空字符串)和a ^(n + 1)= a *(a ^ n)。
    输入项
    	每个测试用例都是代表s(可打印字符的字符串)的一行输入。
    	s的长度至少为1,并且不超过1百万个字符。在最后一个测试用例之后的一行包含一个句点。
    输出量
    	对于每个s,您应该打印最大的n,这样对于某些字符串a,s = a ^ n。
    

    .

    样本输入
    A B C D
    YYYY
    ABABAB
    .
    样本输出
    1
    4
    3
    

    答案

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int nxt[1000010],lenp;
    char p[1000010];
    void pre(){
    	nxt[1]=0;
    	int j=0;
    	for(int i=1;i<lenp;i++){
    		while(j>0&&p[j+1]!=p[i+1])j=nxt[j];
    		if(p[j+1]==p[i+1]) j++;
    		nxt[i+1]=j;
    	}
    }
    int main(){
    	while(cin>>p+1){
    		lenp=strlen(p+1);
    		if(p[1]=='.') break;
    		else {
    			pre();
    			if(lenp %(lenp-nxt[lenp])==0)
    				printf("%d
    ",lenp/(lenp-nxt[lenp]));
    			else 
    				printf("1
    ");
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    poj3264
    codevs4373 窗口==poj2823 Sliding Window
    BZOJ 3831
    1107 等价表达式
    codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析
    BZOJ 1050
    1294 全排列[多种]
    BZOJ 2456
    BZOJ 3725
    BZOJ 3043
  • 原文地址:https://www.cnblogs.com/yuanyulin/p/14026777.html
Copyright © 2011-2022 走看看