1. 程式人生 > >HDU 5944 Fxx and string(數學)

HDU 5944 Fxx and string(數學)

問題描述
青年理論電腦科學家Fxx得到了一個只包含小寫字母的字串。

字串的長度為\:nn,下標從1開始,第\:i\:i位的字母為\:s_isi,現在Fxx想知道有多少三元組\:(i,j,k)\:(i,j,k)滿足下列條件

1、i,j,k\:i,j,k三個數成等比數列

2、s_i=si='yy',s_j=,sj='rr',s_k=,sk='xx'

3.i/ji/jk/jk/j中必須有整數
輸入描述
第一行一個整數\:T(1\leq T\leq100)\:T(1T100)表示資料組數。

接下來\:T\:T行,每行一個僅包含小寫字母的字串(字串長度不超過\:1000010000
輸出描述
輸出共\:T\:
T
行。 每行一個整數表示答案。
輸入樣例
2
xyyrxx
yyrrxxxxx
輸出樣例
0
2

注意:公比可能小於一

程式碼如下:

#include<cstdio>
#include<cstring>
#include<algorithm> 
using namespace std;
char a[100010];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",a);
		int len=strlen(a);
	    int q,i,j,k;
	    int num=0;
		for(int p=0;p<len;p++)
		{
           int i=p+1;
		   for(q=2;;q++)
		   {
	         j=i*q;
			 k=j*q;
			 if(k>len)
			 break;
			 if(a[i-1]=='y'&&a[j-1]=='r'&&a[k-1]=='x')
			 {
			 	num++;
			 }
			 if(a[i-1]=='x'&&a[j-1]=='r'&&a[k-1]=='y')//公比小於1的情況 
			 {
			 	num++;
			 }
		   }		
		   
		}
		printf("%d\n",num);	
	} 
}