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

 

你可能感兴趣的:(du)