牛客 「水」悠悠碧波 ###K ###K //K

题目链接:https://ac.nowcoder.com/acm/problem/53679

思路:要前缀和后缀 那么考虑kmp  把next数组求出来   

先从2到n-1 记录下所有中间出现过的和前缀所对应的 f[nxt[i]]=1  然后再去用nxt[n] 来不断缩小前面对应的前缀来找到答案

k=nxt[n] k=nxt[k] 可以一直找到所有的公共前后缀 长度

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+10;
 4 const int mod=1e9+7;
 5 #define ll long long
 6 #define ull unsigned long long
 7 #define pi pair<int,int>
 8 #define fi first
 9 #define sc second
10 #define pb push_back
11 
12 
13 char s[maxn];
14 int nxt[maxn];
15 int f[maxn];
16 
17 int main()
18 {
19     ios::sync_with_stdio(false);
20     cin.tie(0);
21     cin>>(s+1);
22     int n=strlen(s+1);
23     for(int i=2,j=0;i<=n;i++)
24     {
25         while(j&&s[i]!=s[j+1]) j=nxt[j];
26         if(s[i]==s[j+1]) j++;
27         nxt[i]=j;
28     }
29 
30     for(int i=2;i<n;i++) f[nxt[i]]=1; //在中间出现过的
31     int k=nxt[n];
32     while(k)
33     {
34         if(f[k]) break;
35         k=nxt[k];
36     }
37     for(int i=1;i<=k;i++) cout<<s[i];
38 
39 
40 
41 
42 
43 
44 
45 
46 }
View Code

 

posted @ 2020-10-13 20:59  canwinfor  阅读(118)  评论(0)    收藏  举报