FZU 2183 字符串处理

Problem Description

现在有一些被简单压缩的字符串,例如:a[120]代表120个a。对于字符串acb[3]d[5]e相对于acbbbddddde

现在给你两个字符串cString, nString.一个是被压缩过的字符串,另一个没有被压缩。

求nString是否为cString的子串,如果是输出True,否则输出False.cString的长度clen的范围是0<clen<1000, nString的长度的nlen的范围是0<nlen<1000;cString只包含小写26个字母,[],数字(大于0小于10^9)。nString只包含小写26个字母。

 Sample Input

acb[3]d[5]e bd

 Sample Output

True

 Source

FOJ有奖月赛-2015年03月

  1 #include <cstdio>
  2 #include <cmath>
  3 #include <cstring>
  4 #include <ctime>
  5 #include <iostream>
  6 #include <algorithm>
  7 #include <set>
  8 #include <vector>
  9 #include <queue>
 10 #include <typeinfo>
 11 #include <map>
 12 #include <stack>
 13 typedef long long ll;
 14 #define inf 0x7fffffff
 15 using namespace std;
 16 inline ll read()
 17 {
 18     ll x=0,f=1;
 19     char ch=getchar();
 20     while(ch<'0'||ch>'9')
 21     {
 22         if(ch=='-')f=-1;
 23         ch=getchar();
 24     }
 25     while(ch>='0'&&ch<='9')
 26     {
 27         x=x*10+ch-'0';
 28         ch=getchar();
 29     }
 30     return x*f;
 31 }
 32 
 33 //**************************************************************************************
 34 
 35 
 36 int main()
 37 {
 38     char a[1111];
 39     char b[1111];
 40     char aa[1111];
 41     char bb[1111];
 42     int bna[1111];
 43     int ana[1111];
 44     while(scanf("%s%s",a,b)!=EOF)
 45     {
 46         int l=strlen(b);
 47         int k=0;
 48         int now=0;
 49         bb[++k]=b[0];
 50         bna[k]=1;
 51         for(int i=1; i<l; i++)
 52         {
 53             if(b[i]!=b[i-1])
 54             {
 55                 now=1;
 56                 bb[++k]=b[i];
 57                 bna[k]=1;
 58             }
 59             else
 60             {
 61                 now++;
 62                 bna[k]=now;
 63             }
 64         }
 65         int bk=k;
 66         k=0;
 67         aa[k]='0';
 68         int la=strlen(a);
 69         for(int i=0; i<la; i++)
 70         {
 71             if(a[i]>='a'&&a[i]<='z')
 72             {
 73                 aa[++k]=a[i];
 74                 ana[k]=1;
 75             }
 76             else if(a[i]=='[')
 77             {
 78                 int sum=0;
 79                 i++;
 80                 while(a[i]!=']')
 81                 {
 82                     sum*=10;
 83                     sum+=a[i]-'0';
 84                     i++;
 85                 }
 86                 ana[k]=sum;
 87                 if(aa[k]==aa[k-1])
 88                 {
 89                     //  if(k==5)printf("%c %d\n",aa[k],ana[k]);
 90                     ana[k-1]+=ana[k];
 91                     k--;
 92                 }
 93             }
 94 
 95         }
 96         int ak=k;
 97 
 98 
 99         if(bk>ak)
100         {
101             printf("False\n");
102             continue;
103         }
104         int das=0;
105         for(int i=1; i<=ak-bk+1; i++)
106         {
107             bool flag=true;
108             for(int j=i; j<i+bk; j++)
109             {
110                 if(j==i||j==i+bk-1)
111                 {
112                     if(aa[j]!=bb[j-i+1])
113                     {
114 
115                         flag=false;
116                         break;
117                     }
118 
119                 }
120                 else
121                 {
122                     if(aa[j]!=bb[j-i+1]||ana[j]!=bna[j-i+1])
123                     {
124                         flag=false;
125                         break;
126                     }
127                 }
128             }
129 
130             if(flag)
131             {
132                 printf("True\n");
133                 das=1;
134                 break;
135             }
136         }
137         if(!das)
138         printf("False\n");
139     }
140 
141     return 0;
142 }

 

posted @ 2015-08-02 20:36  meekyan  阅读(260)  评论(0编辑  收藏  举报