HDU2087 剪花布条 经典KMP算法

就是常规KMP算法
给定一个数组 查看里面最多能有多少子串 从左到右一个个数 数到一个子串ans++
KMP算法的描述 戳这里

#include<iostream>
#include<string>
using namespace std;
#define maxn 1000
int nextt[maxn];
void cal_next(string str)
{
 nextt[0]=-1;
 int k=0;
 for(int i=1;i<str.size();i++)
 {
  while(k>-1&&str[k+1]==str[i])
  {
   k=nextt[k];
  }  
  if(str[k+1]==str[i])
  {
   k++;
  }
  nextt[i]=k;
 }
}
int KMP(string str,string ptr)
{
 int k=-1;
 int ans=0;
 cal_next(ptr);
 for(int i=0;i<str.size();i++)
 {
  while(k>-1&&ptr[k+1]!=str[i])
  {
   k=nextt[k];
  }
  if(ptr[k+1]==str[i])
  {
   k++;
  }
  if(k==ptr.size()-1)
  {
   ans++;
   k=-1;//****记得把k调回最初的位置
  }
 }
 return ans;
}
int main()
{
 string str;
 string ptr;
 while(cin>>str&&str!="#")
 {
  cin>>ptr;
  int ans=KMP(str,ptr);
  cout<<ans<<endl;
 }
}
发布了16 篇原创文章 · 获赞 1 · 访问量 269

猜你喜欢

转载自blog.csdn.net/weixin_44254608/article/details/104661269