也要把思緒裡好再下手才會快又好
我將變數對到的值用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;
}
}
}
#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;
}
}
}
沒有留言:
張貼留言