50093. String Substitution

難度:4.5/5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char ins[1024];

int match(char* s, char* pattern, int len_s, int len_p, int delta){
for(int i = 0; i < len_p; i++){
if(s[i + delta] != pattern[i]) return 0;
}
return 1;
}
int get_match(char* s, char* pattern, int len_s, int len_p){
for(int delta = 0; delta <= len_s - len_p; delta++){
if(match(s, pattern, len_s, len_p, delta)) return delta;
}
return -1;
}
void get_ps(char* ins, char* pattern, char* sub, int* pattern_len, int* sub_len){
char sep = ins[1];

int n = 0, m = 0;
for(int i = 2; ins[i] != sep; i++) pattern[n++] = ins[i];
pattern[n] = '\0';

for(int i = n + 3; ins[i] != sep; i++) sub[m++] = ins[i];
sub[m] = '\0';

*pattern_len = n, *sub_len = m;
}
void substitute(char* s, int len_s, char* pattern, char* sub, int pattern_len, int sub_len, int delta){
if(pattern_len >= sub_len){
for(int i = 0; i < sub_len; i++) s[i + delta] = sub[i];
for(int i = delta + pattern_len; i <= len_s; i++) s[i - (pattern_len - sub_len)] = s[i];
}
else{
for(int i = len_s; i >= delta + pattern_len; i--) s[i + (sub_len - pattern_len)] = s[i];
for(int i = 0; i < sub_len; i++) s[i + delta] = sub[i];
}
}


int main(){
char s[1024]; scanf("%s", s);
int len_s = strlen(s);

while(fgets(ins, 1024, stdin) != NULL){
if(ins[0] == 'p') printf("%s\n", s);
else if(ins[0] == 's'){
char pattern[1024], sub[1024];
int pattern_len, sub_len;
get_ps(ins, pattern, sub, &pattern_len, &sub_len);

int rtv = get_match(s, pattern, len_s, pattern_len);
if(rtv != -1){
substitute(s, len_s, pattern, sub, pattern_len, sub_len, rtv);
len_s += (sub_len - pattern_len);
}
}
}
}

50093. String Substitution
https://aaronlin1229.github.io/judgegirl_50093/
Author
Akizumi
Posted on
July 17, 2023
Licensed under