pku1412 Equals are Equals

P.H. 发表于 2007-10-30 09:12:15

判两个表达式是否等价,暴力地随机一百次,表达式处理倒不是太恶心……
6 2843601 hellengine 304K 15MS G++ 2435B 2007-10-29 13:24:25

Source Code

Problem: 1412   User: hellengine
Memory: 304K   Time: 15MS
Language: G++   Result: Accepted
  • Source Code
  • #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <cctype>
    #include <cstdlib>
    using namespace std;

    const int mx = 100;
    const int LIM = 8;
    const int Zeit = 100;

    char s0[mx], ss[mx];
    int f[mx], lst[mx], tp, len, tlen, tab[Zeit][30], zt;
    unsigned long long tv[Zeit];

    void init();
    void random();
    unsigned long long calc(int, int);

    int main()
    {
    srand(time(NULL));

    for(int i = 0; i < Zeit; i++)
    for(int j = 0; j < 30; j++) tab[i][j] = rand() % LIM;

    while(gets(s0) && strcmp(s0, ".")) {
    init();
    for(zt = 0; zt < Zeit; zt++) tv[zt] = calc(0, len);
    while(gets(s0) && strcmp(s0, ".")) {
    init();
    for(zt = 0; zt < Zeit; zt++) if(calc(0, len) != tv[zt]) break;
    printf("%s\n", (zt == Zeit) ? "yes" : "no");
    }
    printf(".\n");
    }
    return 0;
    }

    int get_digit(int pos, int dir)
    {
    for(int i = pos; ; i += dir) {
    if(i < 0 || i >= tlen) return 0;
    if(isdigit(s0[i])) return 1;
    if(s0[i] != ' ') return 0;
    }
    }

    void init()
    {
    tlen = strlen(s0);
    len = 0;

    for(int i = 0; i < tlen; i++)
    if(s0[i] != ' ') ss[len++] = s0[i];
    else if(get_digit(i, -1) && get_digit(i, 1)) ss[len++] = s0[i];

    ss[len] = 0;

    tp = 0;
    for(int i = 0; i < len; i++)
    if(ss[i] == '(') lst[tp++] = i;
    else if(ss[i] == ')') f[lst[--tp]] = i;
    }

    unsigned long long read(int& pos)
    {
    int vr(-1), pwr(1);
    unsigned long long ret;

    if(isdigit(ss[pos])) {
    for(ret = 0; pos < len && isdigit(ss[pos]); pos++) ret = ret * 10 + ss[pos] - '0';
    pos--;
    return ret;
    }

    ret = 1;
    vr = ss[pos] - 'a';

    if(ss[++pos] == '^') pwr = ss[++pos] - '0';
    else --pos;

    for(int i = 0; i < pwr; i++) ret *= tab[zt][vr];
    return ret;
    }

    unsigned long long calc(int l, int r)
    {
    int sig(1), flag(0);
    unsigned long long ret(0), buf(0), tmp;

    for(int i = l; i <= r; i++)
    if(i == r || ss[i] == '+' || ss[i] == '-') {
    ret += sig * buf;
    flag = 0;
    if(i < r && ss[i] == '-') sig = -1;
    else sig = 1;
    }
    else if(ss[i] == '(') {
    tmp = calc(i + 1, f[i]);
    if(flag) buf = buf * tmp; else buf = tmp;
    flag = 1;
    i = f[i];
    }
    else if(ss[i] != ' ') {
    tmp = read(i);
    if(flag) buf = buf * tmp; else buf = tmp;
    flag = 1;
    }

    return ret;
    }


收藏: QQ书签 del.icio.us 订阅: Google 抓虾

最新评论

发表评论

* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 
 

分类小组论坛
杂谈, 娱乐、八卦, 文学、艺术, 体育, 旅游、同城, 象牙塔, 情感, 时尚、生活, 星座, 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定