FZU 2183 简单题

Problem 2183 简单题
Accept: 137 Submit: 636
Time Limit: 1000 mSec Memory Limit : 32768 KB

Problem Description

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

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

求nString是否为cString的子串,如果是输出True,否则输出False.cString的长度clen的范围是0

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
#define inf 0xffffff
#define maxn 1005

struct Char
{
    char c;
    int x;
};

char m[maxn];
Char a[maxn],b[maxn];
int t1,t2;

int main()
{
    while(~scanf("%s",m))
    {
        for(int i = 0; i < maxn; i++){
            a[i].x = b[i].x = 0;
        }
        t1 = t2 = 0;
        int l = strlen(m);
        for(int i = 0; i < l; i++){
            if(m[i] == '['){
                int sum = 0;
                i++;
                while(m[i] != ']'){
                    sum *= 10;
                    sum += m[i] - '0';
                    i++;
                }
                a[t1-1].x += sum - 1;
            }
            else {
                a[t1].c = m[i];
                if(a[t1].c == a[t1-1].c) t1--;
                a[t1++].x += 1;
             }
        }
        scanf("%s",m);
        l = strlen(m);
        for(int i = 0; i < l; i++){
            if(m[i] == '['){
                int sum = 0;
                i++;
                while(m[i] != ']'){
                    sum *= 10;
                    sum += m[i] - '0';
                    i++;
                }
                b[t2-1].x += sum;
            }
            else {
                b[t2].c = m[i];
                if(b[t2].c == b[t2-1].c) t2--;
                b[t2++].x += 1;
             }
        }
        int flag = false;
        for(int i = 0; i < t1; i++){
            for(int j = 0; j < t2; j++){
                if( a[i + j].c == b[j].c){
                    if(j == t2 - 1){
                        if(a[i+j].x >= b[j].x) flag = true;
                        break;
                    }
                    if(j == 0){
                        if(a[i+j].x < b[j].x) break;
                        else continue;
                    }
                    //cout<<"j                  "<<j<<endl;
                    if(a[i+j].x != b[j].x) break;
                }
                else break;
            }
        }
/*
        for(int i = 0; i < t1; i++)
            cout<<a[i].c<<" ";
        cout<<endl;
        for(int i = 0; i < t1; i++)
            cout<<a[i].x<<" ";
        cout<<endl;
        for(int i = 0; i < t2; i++)
            cout<<b[i].c<<" ";
        cout<<endl;
        for(int i = 0; i < t2; i++)
            cout<<b[i].x<<" ";
        cout<<endl;
*/
        if(flag) printf("True\n");
        else printf("False\n");
    }
    return 0;
}

/*
s[3]c[3]d
ssscccd
s[3]c[3]d
sssccd
s[3]c[3]d
sscccd
s[3]c[3]d
ssccd
a[20]
aaa
a[2]
aaa
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值