zoukankan      html  css  js  c++  java
  • POJ2406 Power Strings KMP算法

    给你一个串s,如果能找到一个子串a,连接n次变成它,就把这个串称为power string,即a^n=s,求最大的n.

    用KMP来想,如果存在的话,那么我每次f[i]的时候退的步数应该是一样多的  譬如ababab  我每次退的一定是2步,检验一下这个串的失配指针是不是这个性质,如果是的话,那么n=strlen(s)/退的步数,否则就是直接1好了.

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #define maxn 1000000
    
    int f[maxn+50];
    char P[maxn+50];
    
    void getFail(const char *P,int *f)
    {
    	int m=strlen(P);
    	f[0]=f[1]=0;
    	for(int i=1;i<m;++i){
    		int j=f[i];
    		while(j&&P[i]!=P[j]) j=f[j];
    		f[i+1]=P[i]==P[j]? j+1:0;
    	}
    }
    
    int main()
    {
    	while(scanf("%s",P))
    	{
    		if(strcmp(P,".")==0){
    			break;
    		}
    		getFail(P,f);
    		int n=strlen(P),ans=n-f[n];
    		while(n){
    			if((n-f[n])!=ans){
    				ans=strlen(P);
    				break;
    			}
    			n=f[n];
    		}
    		ans=strlen(P)/ans;
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Herny
    机器学习No.4
    机器学习No.3
    机器学习No.2
    机器学习No.1
    算法第五章上机实践报告
    算法第五章作业
    算法第四章实践报告
    算法第四章作业
    算法第三章作业
  • 原文地址:https://www.cnblogs.com/chanme/p/3485726.html
Copyright © 2011-2022 走看看