题目链接:点击打开链接
模拟字符串水题。
题意 一对{}之间若有n个|则有n+1种可能性,两个$$间有n段连续的空格则有每段空格长度+1再乘到一起种可能,结果是所有可能相乘,超过1e5输出doge
读成一个长字符串就好处理了,可用
long long cur=0;
for(int i=0;i<n;i++){
gets(a+cur);
cur+=strlen(cur+a);
}
无需使用第二个字符串
坑在于可能性不但会爆int 还会爆long long!$的情况虽然考虑到最终结果会爆,但是没想到表示当前可能性的中间结果也会爆,wa了n次
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char a[1024*1024+10];
char t[1024*1024+10];
void input(int n){
memset(a,0,sizeof(a));
long long cur=0;
for(int i=0;i<n;i++){
gets(a+cur);
cur+=strlen(cur+a);
}
}
int main(){
int n;
while(scanf("%d%*c",&n)!=EOF){
input(n);
bool x=0;
bool y=0;
long long n1=1;
long long n2=1;
long long res=1;
long long len=strlen(a);
long long t=1;
for(int i=0;i<len;i++){
if(x){
if(a[i]=='|')n1++;
if(a[i]=='}'){
res*=n1;
n1=1;
x=0;
if(res>100000){
res=-1;
break;
}
}
}
else if(y){
if(a[i]==' ')
t++;
if(a[i]!=' '){
n2*=t;
t=1;
if(n2>1e5){
res=-1;
break;
}
}
if(a[i]=='$'){
res*=n2;
y=0;
n2=1;
if(res>100000){
res=-1;
break;
}
}
}
else if(a[i]=='{')
x=1;
else if(a[i]=='$')
y=1;
}
if(res==-1)
printf("doge\n");
else
printf("%I64d\n",res);
}
return 0;
}