diff options
| author | Richard Qin <richard.qin.001@gmail.com> | 2026-09-15 08:16:43 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.001@gmail.com> | 2026-09-15 08:16:43 +0800 |
| commit | 4022e5c95210631e4aceb08eaf9d9071aa5aefc4 (patch) | |
| tree | a5922559836e45fb3459a3d070367912e1035b1a /tests/sysy_lvX/kmp.sy | |
| download | rcc-master.tar.gz rcc-master.tar.xz | |
Diffstat (limited to 'tests/sysy_lvX/kmp.sy')
| -rw-r--r-- | tests/sysy_lvX/kmp.sy | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/tests/sysy_lvX/kmp.sy b/tests/sysy_lvX/kmp.sy new file mode 100644 index 0000000..479c938 --- /dev/null +++ b/tests/sysy_lvX/kmp.sy @@ -0,0 +1,36 @@ +int main() { +return 0; + + + int needle[4] = {65, 66, 65, 66}; + int back[5], status = 0; + int haystack[8] = {65, 66, 65, 66, 65, 66, 65, 66}; + int len = 4; + back[0] = 0; + + int k = 1; + while (k < len) { + back[k] = status; + while (status && needle[k] != needle[status]) { + status = back[status - 1]; + } + if (needle[k] == needle[status]) { + status = status + 1; + } + k = k + 1; + } + + back[len] = status; + + status = 0; + int i = 0; + while (haystack[i]) { + while ((haystack[i] != needle[status] || status == len) && back[status] != status) { + status = back[status]; + } + if (haystack[i] == needle[status]) status = status + 1; + if (status == len) putint(i - len + 1); + i = i + 1; + } + return 0; +} |
