hdu1711 Number Sequence

来源:互联网 发布:图像语义分割 知乎 编辑:程序博客网 时间:2024/05/17 06:07

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1711


题解:KMP模版题

使用"输入外挂"时间缩短很多(484ms-->156ms)

   "输入外挂":http://blog.csdn.net/niushuai666/article/details/6689043


#include <stdio.h>  #include <string.h>  #define MAXN 1000002   int next[10002],n,m;  int str[MAXN],pattern[10002];    int Scan()// 该外挂适合纯数字输入{      int res = 0, ch, flag = 0;        if((ch = getchar()) == '-')             //判断正负          flag = 1;        else if(ch >= '0' && ch <= '9')           //得到完整的数          res = ch - '0';      while((ch = getchar()) >= '0' && ch <= '9' )          res = res * 10 + ch - '0';        return flag ? -res : res;  }  void getNext()  {      int i,j; i=0;j=-1;    next[0]=-1;      while(i<m)      {  if (j==-1||pattern[i]==pattern[j])          {              i++;              j++;              next[i]=j;          }          else              j=next[j];      }  }    int KMP()  {      int i,j;      i=j=0;      getNext();      while(i<n)      {  if(j==-1||str[i]==pattern[j])          {              i++;              j++; if(j==m)   return i-j+1;        }          else              j=next[j];    }      return -1;  }  int main(){int test,i,ans;scanf("%d",&test);while (test--){scanf("%d %d",&n,&m);for(i=0;i<n;++i)//scanf("%d",&str[i]);str[i]=Scan();for(i=0;i<m;++i)//scanf("%d",&pattern[i]);pattern[i]=Scan();ans=KMP();printf("%d\n",ans);}return 0;}


原创粉丝点击