【KMP】border 题解
题目描述
输入
输出
样例输入
abaabaa 样例输出
17 样例解释: f[2][a] = 1 f[3][a] = 1 f[4][a] = 1 f[4][b] = 2 f[5][a] = 1 f[5][b] = 2 f[6][a] = 3 f[7][a] = 4 f[7][b] = 2 以上为>0的f[][],求和=17 数据范围限制
代码:
#include<cstdio> #include<cstring> #include<iostream> #define ll long long using namespace std; ll nxt[1000010],n,ans,f[1000010][26]; char s[1000010]; void getNext(){ for(ll i=1,j=0;i<n;i++){ while(j>0 && s[i]!=s[j]) j=nxt[j-1]; if(s[i]==s[j]){ j++; } nxt[i]=j; } } int main(){ scanf("%s",s); n=strlen(s); getNext(); for(ll x=1;x<n;x++){ for(char c='a';c<='z';c++){ if(c==s[nxt[x-1]]){ f[x][c-'a']=nxt[x-1]+1; } else{ f[x][c-'a']=f[nxt[x-1]][c-'a']; } ans+=f[x][c-'a']; } } printf("%lld",ans); }
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现