1. 程式人生 > 實用技巧 >也許算是個復健合集

也許算是個復健合集

為啥要說也許因為我感覺他們太能捲了萬一我轉專業沒成功就白復了= =

不過計算思維課(C語言課)上著也沒啥意思,還不如自己學點,總沒壞處

字串

KMP

 1 /*
 2 nxt[i]表示字首字串i的除本身外的最長相同前後綴
 3 */
 4 #include<bits/stdc++.h>
 5 #define N (1000009)
 6 using namespace std;
 7 
 8 char s1[N],s2[N];
 9 int len1,len2,nxt[N];
10 
11 void Build_Next() {
12     int k=-1; nxt[0]=-1;
13     for
(int i=1; i<len2; ++i) { 14 while (k>-1 && s2[k+1]!=s2[i]) k=nxt[k]; 15 if (s2[k+1]==s2[i]) ++k; 16 nxt[i]=k; 17 } 18 } 19 20 void KMP() { 21 int k=-1; 22 for (int i=0; i<len1; ++i) { 23 while (k>-1 && s2[k+1]!=s1[i]) k=nxt[k];
24 if (s2[k+1]==s1[i]) ++k; 25 if (k==len2-1) { 26 printf("%d\n",i-len2+2); 27 k=nxt[k]; 28 } 29 } 30 } 31 32 int main() { 33 scanf("%s%s",s1,s2); 34 len1=strlen(s1); 35 len2=strlen(s2); 36 Build_Next(); 37 KMP(); 38 for (int
i=0; i<len2; ++i) printf("%d ",nxt[i]+1); 39 }
模板
 1 /*
 2 建立一下nxt陣列,並記錄除了最後一位的nxt陣列的最大值
 3 最後用最後一位的nxt值和最大值比較,若最後一位nxt較大就往前跳 
 4 */ 
 5 #include<bits/stdc++.h>
 6 #define N (1000009)
 7 using namespace std;
 8 
 9 char st[N];
10 int len,nxt[N];
11 
12 void Build_Next() {
13     int k=-1,maxn=-1; nxt[0]=-1;
14     for (int i=1; i<len; ++i) {
15         while (k!=-1 && st[k+1]!=st[i]) k=nxt[k];
16         if (st[k+1]==st[i]) ++k;
17         nxt[i]=k;
18         if (i!=len-1) maxn=max(maxn,nxt[i]);
19     }
20     while (k!=-1 && k>maxn) k=nxt[k];
21     if (k==-1) puts("Just a legend");
22     else for (int i=0; i<=k; ++i) printf("%c",st[i]);
23 }
24 
25 int main() {
26     cin>>st;
27     len=strlen(st);
28     Build_Next();
29 }
CF126B