求一串字符有多少种不同的意思,其中关心‘{’,‘}’之间的‘|’。和‘$','$'之间的空格,连续N个空格算N+1种;
AC代码:
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
char s[2*1024*1024+10];
string ss;
int cnt;
int find(int x,int y)
{
int i,count=0;
for(i=x;i<=y;i++)
{
if(ss[i]=='|')
count++;
}
return count+1;
}
int find2(int x,int y)
{
int mark=0;
int i,count=1,ret=1;
for(i=x;i<=y;i++)
{
if(ss[i]==' ')
{
mark=1;
count++;
}
else
{
if(mark==1)
ret*=count;
if(ret>100000)
cnt=1;
count=1;
mark=0;
}
}
return ret;
}
int main()
{
int len;
int n,i;
__int64 ans;
while(scanf("%d",&n)!=EOF)
{
len=strlen(s);
ss="";
cnt=0;
ans=1;
getchar();
for(i=0;i<n;i++)
{
gets(s);
ss+=s;
}
int x,y,a,b;
x=y=a=b=-1;
for(i=0;i<ss.length();i++)
{
if(ss[i]=='{')
a=i;
if(ss[i]=='}')
b=i;
if(a!=-1 && b!=-1)
{
ans*=find(a,b);
a=b=-1;
}
if(x==-1 && ss[i]=='$')
{
x=i;
ss[i]='*';
}
if(y==-1 && ss[i]=='$')
y=i;
if(x!=-1 && y!=-1)
{
ans*=find2(x,y);
x=y=-1;
}
if(ans>100000)
cnt=1;
}
if(cnt==1)
printf("doge\n");
else
printf("%I64d\n",ans);
}
return 0;
}