• 【无聊放个模板系列】POJ2752 EXKMP


     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<cmath>
     8 using namespace std;
     9 #define Maxn 400010
    10 
    11 char s[Maxn];
    12 int l,nt[Maxn];
    13 
    14 int mymin(int x,int y) {return x<y?x:y;}
    15 
    16 void exkmp()
    17 {
    18     int mx=0,id=0;
    19     nt[1]=l;
    20     for(int i=2;i<=l;i++)
    21     {
    22         int k;
    23         if(i<mx) k=mymin(nt[i-id+1],mx-i+1);
    24         else k=0;
    25         while(s[k+1]==s[i+k]&&i+k<=l) k++;
    26         nt[i]=k;
    27         if(i+nt[i]-1>mx) mx=i+nt[i]-1,id=i;
    28     }
    29 }
    30 
    31 int main()
    32 {
    33     while(scanf("%s",s+1)!=EOF)
    34     {
    35         l=strlen(s+1);
    36         exkmp();
    37         // for(int i=1;i<=l;i++) printf("%d ",nt[i]);printf("
    ");
    38         for(int i=l;i>=1;i--)
    39         {
    40             if(nt[i]==l-i+1) printf("%d ",l-i+1);
    41         }
    42         printf("
    ");
    43     }
    44     return 0;
    45 }

    exkmp

    2016-11-17 19:31:47


    再来:

    POJ 3461

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<cmath>
     8 using namespace std;
     9 #define Maxn 10010
    10 #define Maxm 1000010
    11 
    12 char s[Maxn],ss[Maxm];
    13 int l1,l2;
    14 
    15 int nt[Maxn],td[Maxm];
    16 
    17 int mymin(int x,int y) {return x<y?x:y;}
    18 
    19 void exkmp()
    20 {
    21     int mx=0,id=0;
    22     for(int i=2;i<=l1;i++)
    23     {
    24         int k;
    25         if(i<mx) k=mymin(nt[i-id+1],mx-i+1);
    26         else k=0;
    27         while(s[1+k]==s[i+k]&&i+k<=l1) k++;
    28         nt[i]=k;
    29         if(nt[i]+i-1>mx) mx=nt[i]+i-1,id=i;
    30     }
    31     // for(int i=2;i<=l1;i++) printf("%d ",nt[i]);
    32     // printf("
    ");
    33     
    34     mx=0,id=0;
    35     for(int i=1;i<=l2;i++)
    36     {
    37         int k;
    38         if(i<mx) k=mymin(nt[i-id+1],mx-i+1);
    39         else k=0;
    40         while(s[1+k]==ss[i+k]&&i+k<=l2&&1+k<=l1) k++;
    41         td[i]=k;
    42         if(i+td[i]-1>mx) mx=td[i]+i-1,id=i;
    43     }
    44 }
    45 
    46 int main()
    47 {
    48     int T;
    49     scanf("%d",&T);
    50     while(T--)
    51     {
    52         scanf("%s%s",s+1,ss+1);
    53         l1=strlen(s+1);
    54         l2=strlen(ss+1);
    55         exkmp();
    56         int ans=0;
    57         for(int i=1;i<=l2;i++) if(td[i]==l1) ans++;
    58         printf("%d
    ",ans);
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    朴素贝叶斯方法(二分类)[机器学习实战]
    【HIHOCODER 1055】 刷油漆(树上背包)
    【HIHOCODER 1142】 三分·三分求极值
    【HIHOCODER 1420】 Bigint Multiplication
    【HIHOCODER 1403】后缀数组一·重复旋律(后缀数组)
    【HIHOCODER 1589】回文子串的数量(Manacher)
    【HIHOCODER 1599】逃离迷宫4
    【HIHOCODER 1182】欧拉路·三
    【HIHOCODER 1181】欧拉路·二
    【HIHOCODER 1176】 欧拉路·一
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6075153.html
Copyright © 2020-2023  润新知