sdut 1465 公共因子

 

公共因子

Time Limit: 1000MS Memory limit: 65536K

题目描述

题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1465

   假设字符串也有因数,一个字符串为s1,然后可以由n个字符串s2来表示,则称s2是s1的因数。
   如“ac”是“acac”的因数。
    给两个字符串,求它们的公因数有多少个。
 

输入

 多组数据,给定两个字符串,s1,s2。长度不超过100000,并且不含空格。
 

输出

 每组数据一行,公因数有多少个。
 

示例输入

acac
ac
aaa
aa

示例输出

1
1

提示

解题思路:暴力搜索方法解题,公共因子长度一定是第一个字符串的整数倍,第一次剪枝找出所有可能(注意是“可能”)满足第一个字符串条件的因子的长度,保存在数组f1中;第二次剪枝遍历f1数组,找出所有满足第一个字符串的因子,记录它们的长度,保存在数组g1中;遍历g1数组,找出所有满足第二个字符串的公共因子的因子,用count记录所有满足条件因子的个数,count就是最后的结果,经过三次剪枝,最终可以得到答案。

代码:

 1 #include<iostream>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<stdio.h>
 5 using namespace std;
 6 int main()
 7 {
 8     char f[100010],g[100010];
 9     while(scanf("%s%s",f,g)!=EOF)
10     {
11         int lenf=strlen(f),leng=strlen(g);
12         int f1[10000]={0},g1[10000]={0},t=-1,s=-1;
13         int i,j,k;
14         for(i=1;i<=lenf;i++)
15             if(lenf%i==0)f1[++t]=i;
16         int flag;
17         for(i=0;i<=t-1;i++)
18         {
19             char zhong[100010];
20             for(j=0;j<=f1[i]-1;j++)
21                 zhong[j]=f[j];
22             for(j=f1[i];f[j]!='\0';j+=f1[i])
23             {
24                 flag=0;
25                 for(k=0;k<=f1[i]-1;k++)
26                 if(f[j+k]!=zhong[k])
27                 {
28                     flag=1;
29                     break;
30                 }
31                 if(flag==1)break;
32             }
33             if(j==lenf)g1[++s]=f1[i];
34         }
35         g1[++s]=lenf;
36         int count=0;
37     for(i=0;i<=s;i++)
38     {
39         if(leng%g1[i]==0)
40         {
41             for(j=0;g[j]!='\0';j+=g1[i])
42             {
43                 flag=0;
44                 for(k=0;k<=g1[i]-1;k++)
45                 {
46                     if(g[k+j]!=f[k])
47                     {
48                         flag=1;
49                         break;
50                     }
51                 }
52                 if(flag==1)break;
53             }
54             if(j==leng)count++;
55         }
56     }
57     cout<<count<<endl;
58     }
59     return 0;
60 }
61         
62         
63              
View Code

 

posted @ 2013-11-04 22:25  狂盗一枝梅  阅读(319)  评论(0编辑  收藏  举报