HDU5944

来源:互联网 发布:网络文员兼职 编辑:程序博客网 时间:2024/06/06 03:54

题意:给一个字符串,长度小于1w,求满足条件的三元组(i, j, k)的个数。条件为:i,j,k是等比数列,比值是个整数,并且s[i]=='y'&&s[j]=='r'&&s[k]=='x',或者s[i]=='x'&&s[j]=='r'&&s[k]=='y'。

解析:开始是暴力枚举i和j,然后看k是否满足,结果超时了。

换种思路,还是暴力枚举,枚举公比。代码如下:

#include <stdio.h>#include <string.h>#include <stdlib.h>#define N 10005char str[N];int a[N], b[N];int main(){int t;scanf("%d", &t);while(t--){scanf("%s", str);int len = strlen(str);int cnt = 0;for(int i = 2; i * i <= len; i++){for(int j = 1; j*i*i <=len; j++){if(str[j-1]=='y' && str[j*i-1]=='r' && str[j*i*i-1] == 'x')cnt++;if(str[j-1]=='x' && str[j*i-1]=='r' && str[j*i*i-1] == 'y')cnt++;}}printf("%d\n", cnt);}return 0;}
时间复杂度:枚举公比:sqrt(len)=100,再枚举开始位置,由j*i*i<=len可得复杂度为:sqrt(len),所以总的时间复杂度不会超过O(len)。
时间复杂度还是得考虑清楚啊。

0 0