写 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