牛客 「水」悠悠碧波 ###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 }

浙公网安备 33010602011771号