链接:http://acm.hdu.edu.cn/showproblem.php?pid=4891
题意:给你一个题面,按题目的说法能读出几种意思。
思路:好吧,就是一个模拟题吧。解题报告说,题目怎么说你就怎么写。就是这样吧。
有一个坑就是记录竖线数量的时候要用__int64,因为这个WA好久。其它的,把一些情况都考虑好久差不多了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n;
char s[1058576];
int main()
{
int l_left,l_right;
int s_left,s_right;
int exit,posi,posj;
__int64 way,line_num,space_num;
while(scanf("%d",&n)!=EOF)
{
getchar();
way=line_num=1;
l_left=l_right=0;
s_left=s_right=0;
space_num=1;
exit=0;
posi=-1;
posj=-1;
for(int i=1;i<=n;i++)
{
gets(s);
if(exit)continue;
int len=strlen(s);
for(int j=0;j<len;j++)
{
if(s[j]=='{')l_left=1;
if(s[j]=='}')l_right=1;
if(s[j]=='|')line_num++;
if(l_left&&l_right)
{
way*=line_num;
if(way>100000)
{
exit=1;
break;
}
l_left=l_right=0;
line_num=1;
}
if(s[j]=='$'&&s_left==0)
{
s_left=1;
posi=i;
posj=j;
}
if(s[j]=='$'&&s_left==1&&(i!=posi||j!=posj))
{
s_right=1;
way*=space_num;
if(way>100000)
{
exit=1;
break;
}
space_num=1;
}
if(s_left==1&&s[j]==' ')
{
space_num++;
if(s[j+1]!=' '&&j+1!=len)
{
way*=space_num;
if(way>100000)
{
exit=1;
break;
}
space_num=1;
}
}
else if(s_left==1&&s[j]!=' '&&s[j]!='$')
{
way*=space_num;
if(way>100000)
{
exit=1;
break;
}
space_num=1;
}
if(s_left&&s_right)
{
s_left=s_right=0;
space_num=1;
posi=-1;
posj=-1;
}
}
}
if(!exit)
printf("%I64d\n",way);
else
printf("doge\n");
}
return 0;
}