青铜C 王者B B站讲解视频https://www.bilibili.com/video/BV1W5411G7cX?p=3
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; typedef vector<int> vii; typedef vector<ll> vll; typedef pair<int,int> PII; #define so sizeof #define pb push_back #define fi first #define se second #define mp make_pair #define lb lower_bound #define ub upper_bound const db esp=1e-5; const int N=1e6+10,M=1e2+10,Max=1e5+5,inf=0x3f3f3f3f,mod=1e9+7; const ll INF=0x3f3f3f3f3f3f3f3f; int ne[N],n; class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 给定一个字符串s,返回具有相同前缀后缀的子串的第二大长度,反之,返回-1即可。 * @param s string字符串 代表题意中的字符串s * @return int整型 */ //求p[st,en)的ne[i]使得len(=1~ne)最长,在满足p[1~ne]与p[i-len~i]完全相同的情况下 void getne(string &p,int st=1,int en=n){ ne[st]=st-1; for(int i=st+1,j=st-1;i<en;i++){ while(j!=st-1&&p[j+1]!=p[i]) j=ne[j]; if(p[j+1]==p[i]) j++; ne[i]=j; } } int solve(string s) { // write code here s=" "+s; int n=s.size(); getne(s,1,n); int ans=ne[n-1]; if(ans==0) return -1; return ans; } }T;