Common Divisors CodeForces - 182D || kmp最小…
2018-06-17 21:55:13来源:未知 阅读 ()
Common Divisors CodeForces - 182D
思路:用kmp求next数组的方法求出两个字符串的最小循环节长度(http://blog.csdn.net/acraz/article/details/47663477,http://www.cnblogs.com/chenxiwenruo/p/3546457.html),然后取出最小循环节,如果最小循环节不相同答案就是0,否则求出各个字符串含有的最小循环节的数量,求这两个数量的公因数个数(也就是最大公因数的因子个数)就是答案。
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 char s1[100010],s2[100010]; 5 char c[100010],d[100010]; 6 int f[100010]; 7 int m1,m2,ans; 8 int getf(char *P,int *f,int& m) 9 { 10 int j=f[0]=-1,i=0; 11 while(i<m) 12 { 13 while(j>=0&&P[i]!=P[j]) j=f[j]; 14 ++j;++i; 15 f[i]=j; 16 } 17 return m%(m-f[m])==0?m-f[m]:m; 18 } 19 int gcd(int a,int b) 20 { 21 int t; 22 while(b!=0) 23 { 24 t=a; 25 a=b; 26 b=t%b; 27 } 28 return a; 29 } 30 int main() 31 { 32 int i,p,t; 33 scanf("%s%s",s1,s2); 34 m1=strlen(s1); 35 m2=strlen(s2); 36 int a=getf(s1,f,m1); 37 int b=getf(s2,f,m2); 38 strncpy(c,s1,a); 39 strncpy(d,s2,b); 40 if(strcmp(c,d)!=0) 41 printf("0"); 42 else 43 { 44 p=gcd(m1/a,m2/b); 45 t=(int)sqrt(p+0.5); 46 for(i=1;i<=t;i++) 47 if(p%i==0) 48 ans+=2; 49 if(t*t==p) ans--; 50 printf("%d",ans); 51 } 52 return 0; 53 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- CodeForces 1326E - Bombs 2020-03-25
- CodeForces 1320D - Reachable Strings 2020-03-20
- CodeForces 1324 - Codeforces Round #627 (Div. 3) 2020-03-13
- CodeForces 710D Two Arithmetic Progressions 2020-03-06
- CodeForces 1313D Happy New Year 2020-03-04
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash