UVALIVE 3026 Period(kmp)
来源:互联网 发布:查询域名是否已备案 编辑:程序博客网 时间:2024/05/16 15:23
思路:KMP算法。还记得KMP算法中next数组的含义吗。假设next[i]=x,就表明字符串前i个字符的子串中前x个字符和后x个字符是完全相同的。对于一个周期串来说,假设它的长度是len,最小周期是p,那么它的前len-p个字符和后len-p个字符是完全相同的。那么我们只需要求一次next数组,就可以掌握字符串的所有前缀的周期情况了。
这里的next的求法就是最原始的那种,没有优化,因为他是比较自身循环次数,所以不需要进行优化去除不匹配的特殊情况
#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;const int maxn=1000000+5;int next[maxn];int num;void getnext(string p){ int plen=p.size(); int k=-1; int j=0; next[0]=-1; while(j<=plen-1) { if(k==-1||p[j]==p[k]) { j++; k++; next[j]=k; } else k=next[k]; }}int n;void zhuan(string in){ for(int i = 1; i < n; i++)//动态规划求next数组 { int j = i; while(j != 0) { j = next[j]; if(in[j] == in[i]) { next[i + 1] = j + 1; break; } } }}int main(){ string s; int n; int k=0; while(cin>>n&&n) { cin>>s; k++; getnext(s); // for(int i=0;i<n;i++) // cout<<next[i]<<endl; //zhuan(s); // for(int i=0;i<n;i++) // cout<<next[i]<<endl; cout<<"Test case #"<<k<<endl; for(int i=0;i<=n;i++) { if(i%(i-next[i])==0&&next[i]&&i/(i-next[i])>=2) cout<<i<<" "<<i/(i-next[i])<<endl; } cout<<endl; } return 0;}
但是用next应该会报CE
改成了nextt
其实kmp还是蒙蒙的,所以升级版ac自动机过几天再补
阅读全文
0 0
- UVAlive 3026 Period [KMP]
- UVALIVE 3026 Period(kmp)
- UVALive - 3026 - Period (KMP)
- uvalive 3026 Period KMP(失配函数)
- UVALive 3026 Period(KMP裸)
- uvaLive 3026 - Period 水KMP循环结
- UVALive 3026 (LA 3026) Period KMP求字符串周期
- UVALive 3026 Period ( kmp 求前缀最小循环节)
- UVALive 3026 period(周期) kmp算法的应用
- UVALive - 3026 Period
- LA 3026 - Period KMP
- UVALive 3026 Period (KMP上的dp,学习ac自动机的前奏)
- Period UVALive
- Period UVALive
- LA - 3026 - Period(KMP)
- LA-3026 Period(kmp应用)
- 【暑假】[实用数据结构]UVAlive 3026 Period
- uvalive 3026(kmp)
- 数据中的缺失值处理
- HOG特征显示 可视化HOG
- Debian 修改网络配置
- MAC电脑----webpack新手入门项目--图文教程
- PAT (Advanced Level) Practise 1062 Talent and Virtue (25)
- UVALIVE 3026 Period(kmp)
- 显式意图和隐式意图
- 算法-直接插入排序
- andoroid_ActionBar_遇见的错误
- vs2003在win7+后pdb锁住报LNK1201解决方案
- linux-011文件系统超级块的操作函数(挂载卸载系统)解析
- 文本摘要
- java 调试技能之 dubbo 调试 — telnet
- 2017年7月11日00:17:42