题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5944
Fxx and string
Accepts: 213
Submissions: 1867
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/65536 K (Java/Others)
问题描述
青年理论计算机科学家Fxx得到了一个只包含小写字母的字符串。 字符串的长度为n,下标从1开始,第i位的字母为si,现在Fxx想知道有多少三元组(i,j,k)满足下列条件 1、i,j,k三个数成等比数列 2、si='y',sj='r',sk='x' 3.i/j和k/j中必须有整数
输入描述
第一行一个整数T(1≤T≤100)表示数据组数。 接下来T行,每行一个仅包含小写字母的字符串(字符串长度不超过10000)
输出描述
输出共T行。
每行一个整数表示答案。
输入样例
2 xyyrxx yyrrxxxxx
输出样例
0 2
题目大意:略
题目解析:开一重循环,i, j, k分别表示等比数列的三项,注意公比可以为小数(巨坑,,)
代码如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<string>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#define N 10009
using namespace std;
const int inf = 1e9;
const int mod = 1<<30;
const double eps = 1e-8;
const double pi = acos(-1.0);
typedef long long LL;
char s[N];
int main()
{
int i, j, k, t;
scanf("%d", &t);
while(t--)
{
int ans = 0;
s[0] = ' ';
scanf(" %s", &s[1]);
int n = strlen(s);
for(i = 1; i <= n; i++)
{
for(j = i * 2; j <= n; j += i)
{
k = j / i * j;
if(k > n) break;
if((s[i] == 'y' && s[j] == 'r' && s[k] == 'x') || (s[i] == 'x' && s[j] == 'r' && s[k] == 'y')) ans++;
}
}
printf("%d\n", ans);
}
}