题目:
Description
马上就要考试啦,xjy面临挂科的危险,可是又不想读书,hqy要督促xjy学习,调皮的xjy与hqy玩起了捉迷藏游戏。
xjy藏在一个不区分大小写的字符串中,hqy想抓住xjy,hqy能在同一时间取出任意多个字符,并且不改变字符在原有串中的顺序。
hqy很想知道,能刚好抓住xjy的情况(取出的字符在不改变顺序的前提下为“xjy”)一共有多少种呢。
可是这种情况太多啦,hqy数不过来,你要对20180609取模之后告诉hqy结果。
可爱的hqy答应,如果你答对了,就送你一个ac糖。
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个字符
解题思路:开一个结构体,用于记录每个 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;
}