KMP求调!!
查看原帖
KMP求调!!
519573
Daniel_yao楼主2023/2/12 11:53
#include <bits/stdc++.h>
#define ll long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007

using namespace std;

inline int read() {
  rint x=0,f=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  return x*f;
}

void print(int x){
  if(x<0){putchar('-');x=-x;}
  if(x>9){print(x/10);putchar(x%10+'0');}
  else putchar(x+'0');
  return;
}

const int N = 1e6 + 10;

int nx[N], len1, len2;

char t[N], p[N];

signed main() {
  cin >> t >> p;
  len1 = strlen(t), len2 = strlen(p);
  int i = 1, j = 0;
  while(i < len2) {
    if(p[i] == p[j]) {
      j++;
      nx[i] = j;
      i++;
    } else {
      if(j == 0) nx[i] = 0, i++;
      else {
        j = nx[j - 1];
      }
    }
  }
  i = 0, j = 0;
  while(i < len1) {
    if(t[i] == p[j]) {
      i++, j++;
    } else {
      if(j == 0) {
        i++;
      } else {
        j = nx[j - 1];
      }
    }
    if(j == len2 - 1) {
      cout << i - j + 1 << '\n';
    }
  }
  For(i,1,len2) cout << nx[i] << ' ';
  cout << '\n';
  return 0;
}
/*
0123456
ABABABC
012
ABA
*/

2023/2/12 11:53
加载中...