diff options
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; +} |
