KMP板子使用char可过,string会超时,求问原因
  • 板块学术版
  • 楼主TridentDeer
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/14 11:09
  • 上次更新2024/3/14 16:39:01
查看原帖
KMP板子使用char可过,string会超时,求问原因
682495
TridentDeer楼主2024/3/14 11:09

写 HDU - 1686 Oulipo (KMP板子)时,如下代码可以通过,使用的 char:

#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e6+5;
int T,ans,kmp[N],n,m;
char s[N],t[N];
int read(){
	int 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*10+ch-'0';ch=getchar();}
	return x*f;
}
void getkmp(){
	kmp[0]=0;
	for(int i=1;i<n;i++){
		int j=kmp[i-1];
		while(j&&t[i]!=t[j])j=kmp[j-1];
		if(t[i]==t[j])j++;
		kmp[i]=j;
	}
}
void solve(){
	int j=0;
	for(int i=0;i<m;i++){
		while(j&&s[i]!=t[j])j=kmp[j-1];
		if(s[i]==t[j])j++;
		if(j==n){
			//printf("%d\n",i-j+2);
			ans++;
			j=kmp[j-1];
		}
	}
}
signed main(){
	//freopen("std.in","r",stdin);
	T=read();
	while(T--){
		scanf("%s%s",t,s);
		ans=0;n=strlen(t);m=strlen(s);
		getkmp();
		solve();
		printf("%d\n",ans);
	}
	return 0;
}

但仅仅将 char 换成 string 就 TLE 了:

#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e6+5;
int T,ans,kmp[N],n,m;
//char s[N],t[N];
string s,t;
int read(){
	int 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*10+ch-'0';ch=getchar();}
	return x*f;
}
void getkmp(){
	kmp[0]=0;
	for(int i=1;i<n;i++){
		int j=kmp[i-1];
		while(j&&t[i]!=t[j])j=kmp[j-1];
		if(t[i]==t[j])j++;
		kmp[i]=j;
	}
}
void solve(){
	int j=0;
	for(int i=0;i<m;i++){
		while(j&&s[i]!=t[j])j=kmp[j-1];
		if(s[i]==t[j])j++;
		if(j==n){
			//printf("%d\n",i-j+2);
			ans++;
			j=kmp[j-1];
		}
	}
}
signed main(){
	//freopen("std.in","r",stdin);
	T=read();
	while(T--){
		cin>>t>>s;
		ans=0;n=t.length();m=s.length();
		getkmp();
		solve();
		printf("%d\n",ans);
	}
	return 0;
}

想问一下这是为什么/kel

2024/3/14 11:09
加载中...