您的位置:首页 > 其它

[HDU1711]KMP模板

2017-05-08 20:09 351 查看

 

解题关键:1、直接套kmp模板即可,注意最后输出的位置,需要在索引的位置+1。

    2、next用作数组名在oj中会编译错误,

    3、选用g++,只有g++才会接受bits/stdc++.h

 

 OJ中g++和c++的区别:

1、输出double类型时,如果采用G++提交,scanf采用%lf,printf采用%f,否则会报错

2、使用GCC/G++的提醒:

对于64位整数, long long int 和 __int64 都是支持并且等价的.但是在读和写的时候只支持scanf("%
I64d", ...)和printf("%I64d", ...).
不支持"%lld"是因为MinGW下的GCC和G++使用的msvcrt.dll动态链接库并不支持C99标准.
根据ISO C++标准,在G++下,main函数的返回值必须是int,否则将会导致Compile Error(编译错误)的判答

3、G++/GCC使用scanf、printf时注意引用<stdio.h>,只引用<iostream>不识别

 

#include<bits/stdc++.h>
#define N 1000002
using namespace std;
typedef long long ll;
int Next
;
int s
,t
;
int slen,tlen;
int n,m;
void getNext(){
int i=0,j=-1;
Next[0]=-1;
while(i<tlen){
if(j==-1||t[i]==t[j]) Next[++i]=++j;
else j=Next[j];
}
}
int kmp(){
getNext();
int i=0,j=0;
while(i<slen&&j<tlen){
if(j==-1||s[i]==t[j]) ++i,++j;
else j=Next[j];
}
if(j==tlen) return i-j+1;
else return -1;
}
int main(){
ios::sync_with_stdio(0);
int tt;
cin>>tt;
while(tt--){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>s[i];
}
for(int i=0;i<m;i++){
cin>>t[i];
}
slen=n;
tlen=m;
cout<<kmp()<<endl;
}
}

 

 

 

#include<bits/stdc++.h>
#define N 1000000
using namespace std;
typedef long long ll;
char s
,t
;
int Next
;
int slen,tlen;
void getNext(){
int i=0,j=-1;//注意写next数组时j为-1
Next[0]=-1;
while(i<tlen){
if(j==-1||t[i]==t[j]) Next[++i]=++j;
else j=Next[j];
}
}
int kmp_index(){
getNext();
int i=0,j=0;
while(i<slen&&j<tlen){
if(j==-1||s[i]==t[j]) i++,j++;
else j=Next[j];
}
if(j==tlen) return i-j;
else return -1;
}

 

int kmp_count(){
int ans=0,i=0,j=0;
getNext();
for(i=0;i<slen;i++){
while(j>0&&s[i]!=t[j]) j=Next[j];
if(s[i]==t[j]) j++;
if(j==tlen){
ans++;
j=Next[j];
}
}
return ans;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: