SDUT 2463 學密碼學一定得學程式
阿新 • • 發佈:2019-02-13
暴力列舉: #include <bits/stdc++.h> using namespace std; char str1[1000002], str2[10002]; void Find(char str1[], char str2[]); int main() { int n; scanf("%d", &n); while(n --) { scanf("%s", str1); scanf("%s", str2); Find(str1, str2); } return 0; } void Find(char str1[], char str2[]) { int i = 0, j = 0; while(str1[i+j]!='\0'&&str2[j]!='\0') { if(str1[i+j]==str2[j]) { j++; } else { i++; j = 0; } } if(str2[j]=='\0') printf("%d\n", i+1); else printf("::>_<::\n"); } KMP: #include <bits/stdc++.h> using namespace std; int next[1000010]; char str1[1000010], str2[10010]; void creat_next(char *str); int Find(char *str1, char *str2); int main() { int n; cin >> n; while(n --) { scanf("%s", str1); scanf("%s", str2); creat_next(str1); if(Find(str1, str2)) { cout << Find(str1, str2) << endl; } else { cout << "::>_<::" << endl; } } return 0; } void creat_next(char *str) { int lenth = strlen(str); int j = -1, k = 0; next[0] = -1; while(k < lenth) { if(j == -1||str[j] == str[k]) { ++j; ++k; next[k] = j; } else { j = next[j]; } } } int Find(char *str1, char *str2) { int lenth1 = strlen(str1), lenth2 = strlen(str2); int i = 0, j = 0; while(i < lenth1 && j < lenth2) { if(j == -1 || str1[i] == str2[j]) { ++i; ++j; } else { j = next[j]; } } if(j == lenth2) return i-lenth2+1; return 0; }