• HDU 5918 KMP/模拟


    Sequence I

    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 1013    Accepted Submission(s): 393


    Problem Description
    Mr. Frog has two sequences a1,a2,,an and b1,b2,,bm and a number p. He wants to know the number of positions q such that sequence b1,b2,,bm is exactly the sequence aq,aq+p,aq+2p,,aq+(m1)p where q+(m1)pn and q1 .
     
    Input
    The first line contains only one integer T100 , which indicates the number of test cases.

    Each test case contains three lines.

    The first line contains three space-separated integers 1n106,1m106 and 1p106 .

    The second line contains n integers a1,a2,,an(1ai109) .

    the third line contains m integers b1,b2,,bm(1bi109) .
     
    Output
    For each test case, output one line “Case #x: y”, where x is the case number (starting from 1) and y is the number of valid q’s.
     
    Sample Input
    2
    6 3 1
    1 2 3 1 2 3
    1 2 3
    6 3 2
    1 3 2 2 3 1
    1 2 3
     
    Sample Output
    Case #1: 2
    Case #2: 1
     
    Source
     
    题意:
    题解:
     
    kmp
     1 /******************************
     2 code by drizzle
     3 blog: www.cnblogs.com/hsd-/
     4 ^ ^    ^ ^
     5  O      O
     6 ******************************/
     7 #include<bits/stdc++.h>
     8 #include<map>
     9 #include<set>
    10 #include<cmath>
    11 #include<queue>
    12 #include<bitset>
    13 #include<math.h>
    14 #include<vector>
    15 #include<string>
    16 #include<stdio.h>
    17 #include<cstring>
    18 #include<iostream>
    19 #include<algorithm>
    20 #pragma comment(linker, "/STACK:102400000,102400000")
    21 using namespace std;
    22 #define  A first
    23 #define B second
    24 const int mod=1000000007;
    25 const int MOD1=1000000007;
    26 const int MOD2=1000000009;
    27 const double EPS=0.00000001;
    28 //typedef long long ll;
    29 typedef __int64 ll;
    30 const ll MOD=1000000007;
    31 const int INF=1000000010;
    32 const ll MAX=1ll<<55;
    33 const double eps=1e-5;
    34 const double inf=~0u>>1;
    35 const double pi=acos(-1.0);
    36 typedef double db;
    37 typedef unsigned int uint;
    38 typedef unsigned long long ull;
    39 int f[2000100];
    40 void get(int *p,int m)
    41 {
    42     int j=0;
    43     f[0]=f[1]=0;
    44     for(int i=1;i<m;i++)
    45     {
    46         j=f[i];
    47         while(j&&p[j]!=p[i]) j=f[j];
    48         if(p[i]==p[j]) f[i+1]=j+1;
    49         else f[i+1]=0;
    50     }
    51 }
    52 int kmp(int *s,int *p,int n,int m)
    53 {
    54     int num=0;
    55     int j=0;
    56     for(int i=0;i<n;i++)
    57     {
    58         while(j&&p[j]!=s[i]) j=f[j];
    59         if(s[i]==p[j]) j++;
    60         if(j==m) num++;
    61     }
    62     return num;
    63 }
    64 int s[2000100],p[2000100],t[2000100];
    65 int n,m,q;
    66 int main()
    67 {
    68     int T;
    69     scanf("%d",&T);
    70     for(int k=1;k<=T;k++)
    71     {
    72         scanf("%d %d %d",&n,&m,&q);
    73         memset(t,0,sizeof(t));
    74         memset(p,0,sizeof(p));
    75         for(int i=0;i<n;i++)
    76             scanf("%d",&t[i]);
    77         for(int i=0;i<m;i++)
    78             scanf("%d",&p[i]);
    79         get(p,m);
    80         int ans=0;
    81         for(int i=0;i<q;i++)
    82         {
    83             int num=0;
    84             for(int j=i;j<n&&i+(m-1)*q<n;j+=q)
    85                 s[num++]=t[j];
    86             ans+=kmp(s,p,num,m);
    87         }
    88         printf("Case #%d: %d
    ",k,ans);
    89     }
    90     return 0;
    91 }
    92 /*
    93 KMP 处理
    94 *

    模拟

      1 /******************************
      2 code by drizzle
      3 blog: www.cnblogs.com/hsd-/
      4 ^ ^    ^ ^
      5  O      O
      6 ******************************/
      7 #include<bits/stdc++.h>
      8 #include<map>
      9 #include<set>
     10 #include<cmath>
     11 #include<queue>
     12 #include<bitset>
     13 #include<math.h>
     14 #include<vector>
     15 #include<string>
     16 #include<stdio.h>
     17 #include<cstring>
     18 #include<iostream>
     19 #include<algorithm>
     20 #pragma comment(linker, "/STACK:102400000,102400000")
     21 using namespace std;
     22 #define  A first
     23 #define B second
     24 const int mod=1000000007;
     25 const int MOD1=1000000007;
     26 const int MOD2=1000000009;
     27 const double EPS=0.00000001;
     28 //typedef long long ll;
     29 typedef __int64 ll;
     30 const ll MOD=1000000007;
     31 const int INF=1000000010;
     32 const ll MAX=1ll<<55;
     33 const double eps=1e-5;
     34 const double inf=~0u>>1;
     35 const double pi=acos(-1.0);
     36 typedef double db;
     37 typedef unsigned int uint;
     38 typedef unsigned long long ull;
     39 int t;
     40 int a[1000006];
     41 int b[1000006];
     42 int d[1000006];
     43 map<int,int> mp;
     44 vector<int > ve[1000006];
     45 int n,m,p;
     46 int main()
     47 {
     48     while(scanf("%d",&t)!=EOF)
     49     {
     50         for(int l=1; l<=t; l++)
     51         {
     52             mp.clear();
     53             scanf("%d %d %d",&n,&m,&p);
     54             for(int i=1; i<=n; i++)
     55                 scanf("%d",&a[i]);
     56             int jishu=1;
     57             for(int i=1; i<=m; i++ )
     58             {
     59                 ve[i].clear();
     60                 scanf("%d",&b[i]);
     61                 if(mp[b[i]]==0)
     62                 {
     63                     mp[b[i]]=jishu;
     64                     d[jishu]=i;
     65                     jishu++;
     66                 }
     67             }
     68             int minx=10000000;
     69             int what=0;
     70             for(int i=1; i<=n; i++)
     71             {
     72                 if(mp[a[i]])
     73                 {
     74                     ve[mp[a[i]]].push_back(i);
     75                 }
     76             }
     77             for(int i=1; i<jishu; i++)
     78             {
     79                 if(minx>ve[i].size())
     80                 {
     81                     minx=ve[i].size();
     82                     what=i;
     83                 }
     84             }
     85             int sum=0;
     86             for(int i=0; i<ve[what].size(); i++)
     87             {
     88                 int st=ve[what][i]-(d[mp[a[ve[what][i]]]]-1)*p;
     89                 int ed=ve[what][i]+(m-d[mp[a[ve[what][i]]]])*p;
     90                 int zha=1;
     91                 int flag=0;
     92                 if(st<1||ed>n)
     93                     flag=1;
     94                 if(flag==0)
     95                 {
     96                     for(int j=st; j<=ed; j+=p)
     97                     {
     98                         if(a[j]!=b[zha++])
     99                         {
    100                             flag=1;
    101                             break;
    102                         }
    103                     }
    104                 }
    105                 if(flag==0)
    106                     sum++;
    107             }
    108             printf("Case #%d: %d
    ",l,sum);
    109         }
    110     }
    111     return 0;
    112 }
     
  • 相关阅读:
    CSP-S2020总结
    题解-P6687 论如何玩转 Excel 表格
    题解-UVA12995 【Farey Sequence】
    题解-P4159 [SCOI2009] 【迷路】
    题解-SP2916【GSS5
    102. 二叉树的层序遍历
    力扣 160 相交链表 快慢指针 双指针
    3. 无重复字符的最长子串 滑动窗口
    最大连续1的个数 III
    B树和B+树
  • 原文地址:https://www.cnblogs.com/hsd-/p/5975588.html
Copyright © 2020-2023  润新知