问个问题
查看原帖
问个问题
670102
Aventurinestone楼主2024/9/18 19:29

以下代码时间复杂度完全不正确,为什么能通过此题。

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
void f(const string &s, const string &t) 
{ 
    int n = s.length(), m = t.length();
    vector<int> shift(128, m + 1);
    int i, j;
    for (j = 0; j < m; j++)
        shift[t[j]] = m - j;
    for (i =0; i<= n - m; i += shift[s[i + m]]){
        j =0;
        while(j < m && s[i +j] == t[j]) j++;
        if (j == m)
        	printf("%d\n",i+1);
    }
}
string a,b;
int ne[N];
int main()
{
	cin>>a>>b;
	f(a,b);
	int m=b.length();
	ne[0]=-1;
	printf("0 ");
	for(int i=1,j=-1;i<m;i++)
	{
		while(~j&&b[j+1]!=b[i])
			j=ne[j];
		if(b[j+1]==b[i])
			j++;
		ne[i]=j;
		printf("%d ",j+1);
	}
	return 0;
}
2024/9/18 19:29
加载中...