标签:
找字符串中是否存在前后缀相同的字符串,KMP pre数组应用
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmath> 7 #include <queue> 8 #include <map> 9 #include <stack> 10 #include <list> 11 #include <vector> 12 13 using namespace std; 14 15 const int maxn = 1000010; 16 int nb; 17 char b[maxn]; 18 int pre[maxn]; 19 int vis[maxn]; 20 21 //b是模式串,a是目标串 22 void getpre(char *b, int *pre) { 23 int j, k; 24 pre[0] = -1; 25 j = 0; 26 k = -1; 27 while(j < nb) { 28 if(k == -1 || b[j] == b[k]) { 29 j++; 30 k++; 31 pre[j] = k; 32 } 33 else { 34 k = pre[k]; 35 } 36 } 37 } 38 39 int main() { 40 // freopen("in", "r", stdin); 41 while(~scanf("%s", b)) { 42 memset(pre, 0, sizeof(pre)); 43 memset(vis, 0, sizeof(vis)); 44 nb = strlen(b); 45 if(nb < 3) { 46 printf("Just a legend\n"); 47 continue; 48 } 49 getpre(b, pre); 50 for(int i = 0; i < nb; i++) { 51 vis[pre[i]] = 1; 52 } 53 int flag = 0; 54 while(pre[nb]) { 55 if(vis[pre[nb]]) { 56 printf("%.*s\n", pre[nb], b); 57 flag = 1; 58 break; 59 } 60 nb = pre[nb]; 61 } 62 if(!flag) { 63 printf("Just a legend\n"); 64 } 65 } 66 return 0; 67 }
标签:
原文地址:http://www.cnblogs.com/vincentX/p/4767702.html