posts - 100,  comments - 15,  trackbacks - 0
传说可以用kmp的精髓next[]来做,但是怎么都领悟不了,所以就凭感觉直接模拟了
因为s=a^n
取前缀,分别从长度1到strlen,然后与后面剩下的比较,如果ok就说明这个长度是a的最短的长度,然后sterlen(s)/strlen(a)
#include<iostream>
using namespace std;
#define M 1000000

char t[M+1],p[M+1];
int lent,lenp;


bool kmp(char *t,char *p)
{
    
int i,j;
    
for(i=lenp,j=0;i<lent;i++)
    
{
        
if(t[i]!=p[j]) return false;
        
if(t[i]==p[j]) j++;
        
if(j==lenp) j=0;
    }

    
return true;
}



int main()
{
    
int i;
    
while(scanf(" %s",&t)!=EOF && t[0]!='.')
    
{
        lent
=strlen(t);
        
for(i=0;i<lent;i++)
        
{
            p[i]
=t[i];
            p[i
+1]='\0';
            lenp
=i+1;
            
if(lent%lenp==0 && kmp(t,p)) 
            
{
                printf(
"%d\n",lent/lenp);
                
break;
            }

        }

    }
    
    
return 0;
}

posted on 2009-08-03 14:25 wyiu 阅读(279) 评论(0)  编辑 收藏 引用 所属分类: POJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理