题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5944
Fxx and string
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 635 Accepted Submission(s): 271
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
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).
Output
For each case, output the answer.
Sample Input
2
xyyrxx
yyrrxxxxx
Sample Output
0
2
【中文题意】问你能否找到一个等比序列满足上述条件,注意,并没有给出i,j,k的大小,可能k是最大的,也可能i是最大的,所以有两种情况。
【思路分析】枚举公比和第一个数的位置,然后以第一个数的位置乘以公比的平方为判断条件。
【AC代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
char a[100050];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",a);
int len=strlen(a);
int sum=0;
for(int j=0; j<len; j++)
{
for(int i=1; (j+1)*(i)*(i)<=len; i++)
if((a[j]=='y'&&a[(j+1)*i-1]=='r'&&(a[(j+1)*i*i-1]=='x'))||(a[j]=='x'&&a[(j+1)*i-1]=='r'&&(a[(j+1)*i*i-1]=='y')))
{
//printf("%d %d %d\n",j+1,(j+1)*i,(j+1)*i*i);
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}