【qduoj】【捉迷藏】

 题目:

Description

马上就要考试啦,xjy面临挂科的危险,可是又不想读书,hqy要督促xjy学习,调皮的xjy与hqy玩起了捉迷藏游戏。

xjy藏在一个不区分大小写的字符串中,hqy想抓住xjy,hqy能在同一时间取出任意多个字符,并且不改变字符在原有串中的顺序。

hqy很想知道,能刚好抓住xjy的情况(取出的字符在不改变顺序的前提下为“xjy”)一共有多少种呢。

可是这种情况太多啦,hqy数不过来,你要对20180609取模之后告诉hqy结果。

可爱的hqy答应,如果你答对了,就送你一个ac糖。

TIM图片20180531182613.jpg

Input

输入数据有多行,每行有一个字符串。

Output

输出数据应当有多行,每行表示一个答案取模后的结果。每行字符串长度不超过3e5,字符串总长度不超过1e6。

Sample Input 1 

HqyXjy
JyxjyY

Sample Output 1

1
2

Hint

对于第一个样例 抓到的情况为:

1.取第4,5,6个字符

对于第二个样例 抓到的情况为:

1.取第3,4,5个字符

2.取第3,4,6个字符

QQ图片20180531202349.jpg

 解题思路:开一个结构体,用于记录每个 j 前后的x y 的数目,暴力求解,复杂度也是O(n).

ac代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxlen 300000
#define mod 20180609
using namespace std;
char str[maxlen];
struct node{
	int numberx,numbery;
}num[maxlen];
int main()
{
	while(scanf("%s",&str)!=EOF)
	{
		memset(num,0,sizeof(num));
		int sumx=0,sumy=0;
		int len=strlen(str);
		for(int i=0;i<len;i++)
			if(str[i]=='x'||str[i]=='X')
				sumx++;
			else if(str[i]=='j'||str[i]=='J')
				num[i].numberx=sumx;
		for(int i=len-1;i>=0;i--)
			if(str[i]=='y'||str[i]=='Y')
				sumy++;
			else if(str[i]=='j'||str[i]=='J')
				num[i].numbery=sumy;
		long long int sum=0;
		for(int i=0;i<len;i++)
		{
			sum=(sum+(num[i].numberx*num[i].numbery)%mod)%mod;
		}	
		printf("%d\n",sum);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42505741/article/details/81584658