求一串字符有多少种不同的意思,当中关心‘{’,‘}’之间的‘|’。
和‘$','$'之间的空格,连续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 "); else printf("%I64d ",ans); } return 0; }