Fxx and string
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 567 Accepted Submission(s): 236
Problem Description
Young theoretical computer scientist Fxx get a string which contains lowercase letters only.
The string S contains n lowercase letters S1S2…Sn .Now Fxx wants to know how many three tuple (i,j,k) there are which can meet the following conditions:
1、 i,j,k are adjacent into a geometric sequence.
2、 Si= ' y ' ,Sj= ' r ' ,Sk= ' x '.
3.Either j|i or j|k
The string S contains n lowercase letters S1S2…Sn .Now Fxx wants to know how many three tuple (i,j,k) there are which can meet the following conditions:
1、 i,j,k are adjacent into a geometric sequence.
2、 Si= ' y ' ,Sj= ' r ' ,Sk= ' x '.
3.Either j|i or j|k
Input
In the first line, there is an integer
T(1≤T≤100)
indicating the number of test cases.
T lines follow, each line contains a string, which contains only lowercase letters.(The length of string will not exceed 10000 ).
T lines follow, each line contains a string, which contains only lowercase letters.(The length of string will not exceed 10000 ).
Output
For each case, output the answer.
Sample Input
2 xyyrxx yyrrxxxxx
Sample Output
0 2
Source
Recommend
正反判断一下就行,在网上看的他们枚举的公比的,感觉挺厉害,小编这个大水货就没想起来。恩,付下那哥们的代码
http://blog.csdn.net/qq_32944513/article/details/52968100
- #include <iostream>
- #include<stdio.h>
- #include<string.h>
- using namespace std;
- char s[10005];//si=s_i=si='yyy',sj=,s_j=,sj='rrr',sk=,s_k=,sk='xxx'
- int main()
- {
- int T,i,j,k,q,sum;
- cin>>T;
- while(T--)
- {
- scanf("%s",s);
- int l=strlen(s);
- sum=0;
- for(int r=0;r<l;r++)
- {
- i=r+1;
- for(q=2;;q++)//枚举公比
- {
- j=i*q;
- k=j*q;
- if(k>l) break;
- if(s[i-1]=='y'&&s[j-1]=='r'&&s[k-1]=='x')
- sum++;
- if(s[i-1]=='x'&&s[j-1]=='r'&&s[k-1]=='y')//小于1的公比
- sum++;
- }
- }
- cout<<sum<<endl;
- }
- return 0;
- }
下面就是我的代码,也可以ac的,感觉更容易想到
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int t,num,i,j,k,cnt;
char a[10005],b[10005];
scanf("%d",&t);
getchar();
while(t--)
{
gets(a);
num=strlen(a);
cnt=0;
for(i=1;i<=num;i++)
{
if(a[i-1]=='y')
{
for(j=2;i*j<=num;j++)
{
if(a[i*j-1]=='r')
if(i*j*j-1 <= num && a[i*j*j-1] == 'x')
cnt++;
}
}
}
for(i=1;i<=num;i++)
{
if(a[i-1]=='x')
{
for(j=2;i*j<=num;j++)
{
if(a[i*j-1]=='r')
if(i*j*j-1 <= num && a[i*j*j-1] == 'y')
cnt++;
}
}
}
printf("%d\n",cnt);
}
return 0;
}