加油。
To be better.
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1686
代码
#include <cstdio>
#include <cstring>
const int maxn=1000011;
char s[maxn],t[maxn];
int net[maxn];
void GetNext()
{
//求出模式串t的net数组值
int j,k;//j扫描t,k记录t[j]之前与t开头相同的字符个数
j=0,k=-1;
net[0]=-1;
while(j<strlen(t)-1)
{
if(k==-1||t[j]==t[k])
{
j++,k++;//j,k依次移动到下一个字符
net[j]=k;//设置next的值
}
else
k=net[k];//k回溯
}
}
int KMP()
{
GetNext();
int i=0,j=0,ans=0;
int tlen=strlen(t);
int slen=strlen(s);
while( j<tlen&&i<slen)
{
if(j==-1||s[i]==t[j])
{
i++,j++;
}
else
j=net[j];
if(j==tlen)
{
ans++;
i--;
j--;
j=net[j];
}
}
return ans;
}
int main()
{
int n,ans;
scanf("%d",&n);
while(n--)
{
scanf("%s",&t);
scanf("%s",&s);
printf("%d\n",KMP());
}
return 0;
}