Fxx and string
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 376 Accepted Submission(s): 171
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
题目大意:
在字符串中找到三元组(i,j,k)使得其是一个等比数列,使得ai=y,aj=r,ak=x;
问一共有多少种情况。
思路;
1、O(n)枚举起点,枚举一个等比数列的q,暴力找三元组判定即可。
2、注意1 3 9是等比数列,9 3 1也是等比数列。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
char a[100500];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",a+1);
int n=strlen(a+1);
ll output=0;
for(int i=1;i<=n;i++)
{
for(int j=2;j<=n;j++)
{
if(i*j<=n&&i*j*j<=n)
{
if(a[i]=='y'&&a[i*j]=='r'&&a[i*j*j]=='x')
{
output++;
}
if(a[i]=='x'&&a[i*j]=='r'&&a[i*j*j]=='y')
{
output++;
}
}
else break;
}
}
printf("%I64d\n",output);
}
}