2013年1月24日 星期四

SGU 189 Perl-like Substr 5/10

有好多細節要考慮的題目

也要把思緒裡好再下手才會快又好

我將變數對到的值用map存下來,比較方便

在賦值時,有兩種情況:substr跟$name

所以我做出一個函數返回值是string

並再做出一個函數可以將substr拆成三個部分
(哪一個變數,從哪到哪)

以及一個很基本的清理函數
(用來把兩旁的分號空白去除)

還有可以用來將字串轉整數的函數

這些函數都是基於兩旁沒有任何空白這樣…

所以在main函數裡就將這些東西拼湊起來即可

我學到一個挺有趣的scanf方式

scanf("%[^=]s", s);

這樣,他就會一直讀取直到讀到 '=' 或EOF

就是^後面接一個符號那樣 

//By momo
#include<map>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>

#define N 11000
#define INF 999999999

using namespace std;

map<string, string> mp;

int stoi(string s){
    int fl = 1, i = 0, ret = 0;
    if(s[0] == '-') fl = -1, i++;
    for(; i < (int)s.size(); i++) ret = ret*10 + s[i] - '0';
    return ret * fl;
}

string clean(string s){
    int fst = 0, l = s.size();
    while(s[fst] == ' ' || s[fst] == ';') fst++;
    while(l > 0 && s[l-1] == ' ' || s[l-1] == ';') l--;
    return s.substr(fst, l-fst);
}

string Super(string s, int& x, int&y){
    int fst;   
    for(fst = 0; ; fst++) if(s[fst] == '(') break; fst++;
    while(s[fst] == ' ') fst++; s = s.substr(fst, s.size()-fst);
    for(fst = 0; 1; fst++) if(s[fst] == ',') break;
    string str = clean(s.substr(0, fst));

    while(s[fst] == ' ' || s[fst] == ',') fst++;
    s = s.substr(fst, s.size()-fst);
    for(fst = 0; fst < (int)s.size(); fst++)
        if(s[fst] == ',' || s[fst] == ')') break;
    x = stoi(clean(s.substr(0, fst)));
    if(x < 0) x = (mp[str]).size() + x;
    if(s[fst] == ')') return str;
   
    while(s[fst] == ' ' || s[fst] == ',') fst++;
    s = s.substr(fst, s.size()-fst);
    for(fst = 0; fst < (int)s.size(); fst++)
        if(s[fst] == ')') break;
    y = stoi(clean(s.substr(0, fst)));
    if(y < 0) y = (mp[str]).size() - x + y;
    return str;
}

string get_string(string s){
    if(s[0] == '$') return mp[s];
    else{
        int x, y = INF;
        string str = mp[Super(s, x, y)];
        return str.substr(x, y);
    }
}

char nu[N], s[N], s2[N];
int main(){
    int n, m;
    scanf("%d%d\n", &n, &m);
    while(n--){
        scanf("%[^=]s", s); string str = s; str = clean(str);
        scanf("%c", nu); gets(s); string str2 = s;
        str2 = clean(str2); mp[str] = str2.substr(1, str2.size()-2);
    }
    while(m--){
        char ty = ' ';
        while(ty == ' ') scanf("%c", &ty);
        if(ty == '$'){
            scanf("%[^=]s", s); string str = "$"; str = clean(str+s);
            scanf("%c", nu); gets(s); string str2 = s;
            str2 = clean(str2); mp[str] = get_string(str2);
        }
        if(ty == 's'){
            scanf("%[^=]s", s2); string str = "s"; str += s2;
            scanf("%c", nu); gets(s); string str2 = s;
            str = clean(str), str2 = clean(str2); int a, b = N;
            string fir = Super(str, a, b), sec = get_string(str2);
            string xxx = mp[fir]; xxx.replace(a, b, sec); mp[fir] = xxx;
        }
        if(ty == 'p'){
            scanf("%[^(]s", nu); scanf("%c", nu);
            gets(s); string str = s; int l = strlen(s), cnt = 0;
            while(l > 0 && !cnt){ if(str[l-1] == ')') cnt++; l--; }
            str = clean(str.substr(0, l)); cout << get_string(str) << endl;
        }
    }
}

沒有留言:

張貼留言