fzu 2183 简单题

解析:

直接暴力求解,将两个cstring中的字符提取出来存在结构体中
结构体中保存当前位置的字符ch,接下来连续字符的个数num。
再把nstring压缩,存于结构题中,将nstring的结构体掐头去尾,头部和尾部的字符要相同,头部和尾部的要小于等于目标串的个数,中间的部分要相同,由于数据量比较小,中间部分直接用O(n^2)暴力比较。

AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cctype>
using namespace std;
typedef long long ll;

const int N = 2e5;
struct Node {
    char ch;
    int num;
}tar[N], pat[N];

int tot, tot2;
bool equal(Node a, Node b) {
    if(a.ch == b.ch && a.num == b.num) return true;
    return false;
}
bool biger(Node a, Node b) {
    if(a.ch == b.ch && a.num >= b.num) return true;
    return false;
}

bool judge() {
    if(tot2 == 1) {
        for(int i = 0; i < tot; i++)
            if(biger(tar[i], pat[0]))
                return true;
    }else if(tot2 == 2) {
        for(int i = 0; i < tot-1; i++)
            if(biger(tar[i], pat[0]) && biger(tar[i+1], pat[1]))
                return true;
    }else {
        for(int i = 0; i < tot; i++) {
            if(i + tot2 < tot && biger(tar[i], pat[0]) 
                    && biger(tar[i+tot2-1], pat[tot2-1])
                    && equal(tar[i+1], pat[1])) {
                int k = i+2, j;
                for(j = 2; j < tot2-1; j++, k++) {
                    if(equal(tar[k], pat[j]))
                        continue;
                    else
                        break;
                }
                if(j == tot2-1)
                    return true;
            }
        }
    }
    return false;
}
char cstr[N], nstr[N];
int main() {
    while(scanf("%s", cstr) != EOF) {
        scanf("%s", nstr);
        tot = tot2 = 0;
        int sum = 0;
        for(int i = 0; cstr[i]; i++) {
            if(cstr[i+1] == '[') {
                int j = i+2;
                sum = 0;
                do {
                    sum += sum*10 + (cstr[j] - '0');
                    j++;
                }while(isalnum(cstr[j]));
                tar[tot].ch = cstr[i];
                tar[tot++].num = sum;
                i = j;
            }else {
                sum = 1;
                for(int j = i+1; cstr[j] && cstr[i] == cstr[j]; j++) {
                    sum++;
                    i = j;
                }
                tar[tot].ch = cstr[i];
                tar[tot++].num = sum;
            }
        }
        for(int i = 0; nstr[i]; i++) {
            sum = 1;
            for(int j = i+1; nstr[j] && nstr[i] == nstr[j]; j++) {
                sum++;
                i = j;
            }
            pat[tot2].ch = nstr[i];
            pat[tot2++].num = sum;
        }
        printf("%s\n", judge()? "True" : "False");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值