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