菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
200
0

KMP

原创
05/13 14:22
阅读数 12782
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <string>
  7 #include <deque>
  8 #include <vector>
  9 #include <set>
 10 #include <map>
 11 #include <cmath>
 12 using namespace std;
 13 #define  ll long long 
 14 #define  N  100009
 15 #define  gep(i,a,b)   for(int i=a;i<=b;i++)
 16 #define  gep1(i,a,b)  for(int i=a;i>=b;i--)
 17 #define  gepp(i,a,b)  for(ll i=a;i<=b;i++)
 18 #define  gepp1(i,a,b) for(ll i=a;i>=b;i--)
 19 #define  mem(a,b)     memset(a,b,sizeof(a))
 20 #define  ph  push_back
 21 #define  lowbit(x)  x&(-x)
 22 #define  P  pair<int,bool> 
 23 int c[100];
 24 char  p[100];
 25 void get(){
 26    mem(c,0);
 27     int i=0,j=-1;
 28     c[0]=-1;
 29     while(p[i]){
 30         if(j==-1||p[i]==p[j]){
 31             c[++i]=++j;
 32         }
 33         else
 34         {j=c[j];
 35         }
 36     }
 37     /*
 38     for(int i=0;i<=strlen(p);i++){//有==
 39         printf("%d ",c[i]);
 40     }
 41     
 42     azcaz
 43     -1 0 0 0 1 2
 44 
 45      printf("\n");
 46      */
 47      
 48 }
 49 int kmp(){
 50 int i,j;
 51 i=j=0;
 52 get();
 53     while(i<n&&j<m){
 54         if(j==-1||s[i]==p[j]){
 55             i++,j++;
 56         }
 57         else
 58         {
 59             j=c[j];
 60         }
 61         if(j==m)
 62         {
 63             return i-m+1;
 64         }
 65     }
 66     return -1;
 67     /*
 68     1 2 1 2 3 1 2 3 1 3 2 1 2//初始下标为0
 69     1 2 3 1 3
 70     6
 71     1 2 1 2 3 1 2 3 1 3 2 1 2
 72     1 2 3 2 1
 73     -1
 74    */
 75 }
 76 int kmp(){
 77 int lens=strlen(s);
 78 int lenp=strlen(p);
 79 int i=0,j=0;
 80 int ans=0;
 81 get();
 82 while(i<lens&&j<lenp){
 83 if(j==-1||s[i]==p[j]){
 84     i++;
 85     j++;
 86 
 87 }
 88 else
 89 {
 90     j=c[j];
 91 }
 92 if(j==lenp){
 93     ans++;
 94     j=c[j];
 95 }
 96 
 97 }
 98 return ans;
 99 /*
100 AZA
101 AZAZAZA
102 3
103 */
104 }
105 int kmp(){
106 int lens=strlen(s);
107 int lenp=strlen(p);
108 int i=0,j=0;
109 int ans=0;
110 get();
111 while(i<lens&&j<lenp){
112 if(j==-1||s[i]==p[j]){
113     i++;
114     j++;
115 
116 }
117 else
118 {
119     j=c[j];
120 }
121 if(j==lenp){
122     ans++;
123     j=0;
124 }
125 
126 }
127 return ans;
128 /*
129 aaaaaa  
130 aa
131 3
132 */
133 
134 }
135 
136      while(t--)
137     {
138         scanf("%s",p);
139         get();
140         int len2=strlen(p);
141         int x=len2-a[len2];//最小循环节长度
142         if(x==len2)
143         {
144             printf("%d\n",len2);//abcde:5 再加abcde 才可以构成循环
145         }
146         else  if (len2%x==0)//aaa :1 已经可以构成循环了
147         {
148             printf("0\n");
149         }
150         else
151         {
152             printf("%d\n",x-len2%x);// abca : 3 再加bc才可以构成循环
153         }
154     }

 

发表评论

0/200
200 点赞
0 评论
收藏