Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int pattern[] = { 1, 2, 3, 1 }; /* I use int instead of char, simpler */
- const int n = sizeof(pattern) / 4;
- int D[n];
- int f[n];
- int j = n;
- int t = n + 1;
- for (int k = 1; k <= n; k++){
- D[k-1] = 2 * n - k;
- }
- while (j > 0) {
- f[j-1] = t;
- while (t <= n) {
- if (pattern[j-1] != pattern[t-1]) {
- D[t-1] = min(D[t-1], n - j);
- t = f[t-1];
- }
- else {
- break;
- }
- }
- t = t - 1;
- j = j - 1;
- }
- int f1[n];
- int q = t;
- t = n + 1 - q;
- int q1 = 1;
- int j1 = 1;
- int t1 = 0;
- while (j1 <= t) {
- f1[j1 - 1] = t1;
- while (t1 >= 1) {
- if (pattern[j1 - 1] != pattern[t1 - 1]) {
- t1 = f1[t1 - 1];
- }
- else {
- break;
- }
- }
- t1 = t1 + 1;
- j1 = j1 + 1;
- }
- while (q < n) {
- for (int k = q1; k <= q; k++) {
- D[k - 1] = min(D[k - 1], n + q - k);
- }
- q1 = q + 1;
- q = q + t - f1[t - 1];
- t = f1[t - 1];
- }
- for (int i = 0; i < n; i++)
- {
- cout << D[i] << " ";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement