[51nod 1304]字符串的相似度
2016-12-06 16:50
411 查看
题目描述
我们定义2个字符串的相似度等于两个串的相同前缀的长度。例如 “abc” 同 “abd” 的相似度为2,”aaa” 同 “aaab” 的相似度为3。给出一个字符串S,计算S同他所有后缀的相似度之和。例如:S = “ababaa”,所有后缀为:
ababaa 6
babaa 0
abaa 3
baa 0
aa 1
a 1
S同所有后缀的相似度的和 = 6 + 0 + 3 + 0 + 1 + 1 = 11
扩展KMP
做一遍扩展KMP然后把next都加起来。#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; const int maxn=1000000+10; int next[maxn]; char s[maxn]; int i,j,k,l,t,n,m; ll ans; int main(){ scanf("%s",s+1); n=strlen(s+1); j=2; while (s[1+next[2]]==s[2+next[2]]) next[2]++; fo(i,3,n){ if (i>j+next[j]-1){ while (s[1+next[i]]==s[i+next[i]]) next[i]++; } else{ next[i]=min(next[i-j+1],j+next[j]-i); while (s[1+next[i]]==s[i+next[i]]) next[i]++; } if (i+next[i]>j+next[j]) j=i; } fo(i,2,n) ans+=(ll)next[i]; ans+=(ll)n; printf("%lld\n",ans); }
相关文章推荐
- 段错误
- SpringMVC实现文件下载的两种方法
- Vuforia 暂停摄像机 暂停云识别
- Qihoo360 Atlas MySQL Proxy测试小结
- 树莓派不小心误删了桌面的回收站,如何找回
- 异常分析初探
- 2章 上级1-3 关键代码
- MySQL菜单父子表排序
- (福利一波)Qt for Win/Linux/Android/iOS/嵌入式linux环境搭建资源分享
- iframe获取父、子窗口的方法
- c#实现cmd功能
- 浅谈EventBus框架的使用
- 理解nodejs中的几个概念
- OnTriggerEnter
- 原始粉丝积累秘籍【学员必看】
- [51nod1301]集合异或和
- C#判断某元素是否存在数组中
- android底层驱动学习之linux输入子系统的理解
- eclipse常用快捷键
- 高CPU调试(二)