行政机关单位网站建设要求,专做腰带的网站,想开个网站怎么做,WordPress全局屏蔽谷歌文章目录题目描述解析问题总结代码题目描述 解析
我们可以看到 如果A是B的周期 那么B一定可以写成#xff1a; A1A2A1 的形式 注意到#xff1a;A1就是KMP中的公共前后缀 要使A最大#xff0c;要使A1最短 也就是求最短公共前后缀 这怎么求呢#xff1f; 我们注意到#x…
文章目录题目描述解析问题总结代码题目描述 解析
我们可以看到 如果A是B的周期 那么B一定可以写成 A1A2A1 的形式 注意到A1就是KMP中的公共前后缀 要使A最大要使A1最短 也就是求最短公共前后缀 这怎么求呢 我们注意到 B的最短前后缀其实也是B的最长前后缀就是KMP处理出来的那个东西的最短前后缀 所以递归求解即可过程类似于并查集 边界条件失配数组为0时返回本身
int find(int x){return p[x] ? p[x]find(p[x]) : x;
}问题
这题看了题解 一开始思路其实差不多 但就是觉得似乎考虑不到最短公共前后缀大于字符串长度一半的情形 但后来自己又想想其实这样使不存在的 如图 它一定还会存在更短的公共前后缀就是图中红色的部分 这样就解决啦
总结
对KMP的理解还是要加深一些 本题类似并查集的方法找最短公共前后缀的方法也值得借鉴
代码
#includebits/stdc.h
using namespace std;
#define ll long long
const int N1e6100;
char s[N];
int p[N],l,k;
void solve(){p[1]0;for(int i1,j0;il;i){while(j0s[i1]!s[j1]) jp[j];if(s[i1]s[j1]) j;p[i1]j;}return;
}
int find(int x){return p[x] ? p[x]find(p[x]) : x;
}
int main(){scanf(%d,k);scanf( %s,s1);lstrlen(s1);solve();ll ans0;for(int i1;il;i) ansi-find(i);printf(%lld,ans);
}