HUD3336
2016-05-10 11:47
197 查看
/* 巧妙地使用fail数组 根据fail数组的定义 fail[i] 有 长度为i的子串最长公共前后缀为fail[i] 比如样例 fail 0 0 1 2 那么我们维护一个ans[i]表示到i位置的时候 前i位置子串的匹配次数 比如 a b a ans[1]=1 ans[2]=1 到ans[3]的时候 发现 a 又出现了一边 说明之前的a子串统计少了 相应的可以根据 fail找到a的位置在统计一遍就不漏了 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 200010 using namespace std; int T,an,ans[maxn],l,fail[maxn]; char s[maxn]; void kmp_init() { int p=0; for(int i=2;i<=l;i++) { while(p&&s[p+1]!=s[i]) p=fail[p]; if(s[p+1]==s[i]) p++; fail[i]=p; } } int main() { scanf("%d",&T); while(T--) { scanf("%d",&l); scanf("%s",s+1); an=0;//初始化害死人 memset(ans,0,sizeof(ans)); memset(fail,0,sizeof(fail)); kmp_init(); for(int i=1;i<=l;i++) { ans[i]=1; if(fail[i])//如果当前的子串存在公共前后缀 //说明这个公共缀之前统计少了 ans[i]+=ans[fail[i]]; an=(an+ans[i])%10007; } printf("%d\n",an); } }
相关文章推荐
- Java(Android)线程池
- elasticsearch实时分布式搜索和分析引擎
- php 之 房屋租赁练习(0509)
- 关于网站流量的优化
- modal 弹出层后禁止底层滚动
- OpenCV的那些事——利用RANSAC消除错误姿态
- Android Studio修改应用包名
- 动态绑定实现机制
- jquery获取input单选按钮点击事件及单选按钮值的方法
- ARC和MRC混编
- js实现的简单图片浮动效果完整实例
- display:inline、block、inline-block的区别
- 利用WIX制作安装包(3)
- 浅谈Android中的MVC与MVP模式
- 第92讲 SparkStreming中的Transformations和状态管理
- OpenCV 轮廓的凸性
- [centos 6.7]docker 不能连接问题
- ubuntu14.04安装MATLAB R2014a
- APK签名校验绕过
- 猿说摄影(上)--入坑指南