sdut2784cf 126b Good Luck!(next数组)
生活随笔
收集整理的這篇文章主要介紹了
sdut2784cf 126b Good Luck!(next数组)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接
next數組的巧妙應用 ?學弟出給學弟的學弟的題。。
求最長的 是前綴也是后綴同時也是中綴的串 ?next的數組求的就是最長的前后綴 但是卻不能求得中綴
所以這里 就把尾部去掉之后再求 這樣就可以保證是中綴了 先把所有既是前綴也是后綴的長度的求出來標記 然后再去掉尾部 求一下最大 既是前綴又是后綴的長度
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<queue> 8 #include<vector> 9 using namespace std; 10 #define INF 0xfffffff 11 #define N 1000010 12 char s[N]; 13 int next[N]; 14 int vis[N]; 15 void kmp(int k) 16 { 17 int i,j=-1; 18 next[0] = -1; 19 for(i = 1 ; i < k ; i++) 20 { 21 while(j>-1&&s[i]!=s[j+1]) 22 j = next[j]; 23 if(s[i]==s[j+1]) 24 j++; 25 next[i] = j; 26 } 27 } 28 int main() 29 { 30 //freopen("data.in","r",stdin); 31 //freopen("data1.out","w",stdout); 32 int n,i; 33 int kk=1; 34 cin>>n; 35 while(n--) 36 { 37 memset(vis,0,sizeof(vis)); 38 memset(next,0,sizeof(next)); 39 cin>>s; 40 int k = strlen(s); 41 kmp(k); 42 int len = next[k-1]; 43 vis[len] = 1; 44 while(len!=-1) 45 { 46 vis[next[len]] = 1; 47 len = next[len]; 48 } 49 int mm = 0; 50 for(i = 0 ; i < k-1 ; i++) 51 if(vis[next[i]]) mm = max(mm,next[i]+1); 52 if(mm) 53 { 54 for(i = 0 ;i < mm ; i++) 55 cout<<s[i]; 56 puts(""); 57 } 58 else 59 puts("Bad Luck!"); 60 } 61 return 0; 62 } 63 64 /************************************** 65 Problem id : SDUT OJ 2784 66 User name : shang 67 Result : Accepted 68 Take Memory : 9240K 69 Take Time : 180MS 70 Submit Time : 2014-02-15 15:57:03 71 **************************************/ View Code?
轉載于:https://www.cnblogs.com/shangyu/p/3550620.html
總結
以上是生活随笔為你收集整理的sdut2784cf 126b Good Luck!(next数组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fiddler进行模拟Post提交jso
- 下一篇: jquery获取文档高度和窗口高度的例子