您的位置:首页 > 其它

D. Common Divisors CF 182D

2012-04-25 11:29 239 查看
/*
KMP s[k....j]==s[m....i](两个字符串完全相等)
char s[10005];
int next[10005];

int get_next(int len)
{
int i=0,j=-1;
next[0]=-1;
for(i=1;i<len;i++)
{
while(j>=0 && s[j+1]!=s[i])//j>=0
j=next[j];
if(s[j+1]==s[i])
j++;
next[i]=j;

}
return next[len-1];
}
*/

#include<stdio.h>
#include<string.h>

int get_next(int len,char s[],int next[])
{
int i=0,j=-1;
next[0]=-1;
for(i=1;i<len;i++)
{
while(j>=0 && s[j+1]!=s[i])
j=next[j];
if(s[j+1]==s[i])
j++;
next[i]=j;

}
return len-next[len-1]-1;
}

char s[100005];
char t[100005];
int len_s,len_t;
int next1[100005],next2[100005];

int gcd(int a,int b)
{
return !b?a:gcd(b,a%b);
}

int main()
{
int i,j;
int flag;
int c1,c2;
while(scanf("%s%s",s,t)!=EOF)
{
len_s=strlen(s);
len_t=strlen(t);
c1=get_next(len_s,s,next1);
c2=get_next(len_t,t,next2);
int ans=0;
flag=0;
if(c1==c2)
{
for(i=0;i<c1;i++)
if(s[i]!=t[i])
break;
if(i<c1)flag=1;
if(len_s%c1!=0 ||len_t%c1!=0) flag=1;
if(!flag)
{
int g1=len_s/c1 ,g2=len_t/c2;
for(i=1;i<=g1 && i<=g2;i++)
if(g1%i==0 && g2%i==0)
ans++;
}
printf("%d\n",ans);
}
else
{
if(len_s%len_t==0)
{
for(i=0;i<len_s;i++)
if(s[i]!=t[i%len_t])
break;
if(i>=len_s) ans++;
}
else if(len_t%len_s==0)
{
for(i=0;i<len_t;i++)
if(t[i]!=s[i%len_s])
break;
if(i>=len_t) ans++;
}
printf("%d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c