zoukankan      html  css  js  c++  java
  • A

    题意:

          反正就是给出一个T,然后每个T:一个n,一个m,表示主串的数字数量和模式串的数字数量,求第一个匹配的位置。

    思路:

         KMP模板套套就好啦。

    参考代码:

     1 #include <iostream>
     2 #include <vector>
     3 #include <map>
     4 #include <string>
     5 #include <queue>
     6 #include <stack>
     7 #include <set>
     8 #include <algorithm>
     9 
    10 #include <cstdio>
    11 #include <cstring>
    12 #include <cmath>
    13 #include <cstdlib>
    14 using namespace std;
    15 
    16 const int INF=0x3f3f3f3f;
    17 const int SIZE=10000;
    18 typedef long long LL;
    19 
    20 int nextt[10005];
    21 int a[1000005];
    22 int b[10005];
    23 int n,m;
    24 void findnext()
    25 {
    26     memset(nextt,0,sizeof(nextt));
    27     int len=m;
    28     nextt[0]=-1;
    29     int k=-1,j=0;
    30     while(j<len)
    31     {
    32         if(k==-1||b[k]==b[j])
    33         {
    34             k++;
    35             j++;
    36             if(b[j]!=b[k])
    37                 nextt[j]=k;
    38             else
    39                 nextt[j]=nextt[k];
    40         }
    41         else
    42         {
    43             k=nextt[k];
    44         }
    45     }
    46 }
    47 
    48 int kmp()
    49 {
    50     int i=0,j=0;
    51     int sa=n,sb=m;
    52     while(i<sa&&j<sb)
    53     {
    54         if(j==-1||a[i]==b[j])
    55         {
    56             i++;
    57             j++;
    58         }
    59         else
    60         {
    61             j=nextt[j];
    62         }
    63     }
    64     if(j==sb)
    65         return i-j+1;
    66     else
    67         return -1;
    68 }
    69 int main()
    70 {
    71     int t;
    72     scanf("%d",&t);
    73     while(t--)
    74     {
    75         scanf("%d%d",&n,&m);
    76         for(int i=0;i<n;i++)
    77         {
    78             scanf("%d",&a[i]);
    79         }
    80         for(int j=0;j<m;j++)
    81             scanf("%d",&b[j]);
    82         findnext();
    83         int res=kmp();
    84         printf("%d
    ",res);
    85 
    86     }
    87     return 0;
    88 }
    View Code
    まだまだだね
  • 相关阅读:
    terminal下历史命令自动完成功能history auto complete
    Shell中while循环的done 后接一个重定向<
    python 链接hive
    shell 学习基地
    c++ 获取本地ip地址
    c++ 如何实现,readonly
    c++ 语法
    c++ 信号量
    vim插件介绍
    c++ memset 函数 及 坑
  • 原文地址:https://www.cnblogs.com/xxQ-1999/p/7522461.html
Copyright © 2011-2022 走看看