hdu3336(next数组的应用)
2016-07-26 17:02
190 查看
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int N=200002; int Next[200002]; char t[200002]; int tlen; int num[200002]; void MakeNext() { int j,k; j=0,k=-1; Next[0]=-1; while(j<tlen) { if(k==-1||t[j]==t[k]) Next[++j]=++k; else k=Next[k]; } } //next数组返回的是如果模式串位置k处字符与主串字符不匹配 //则主串该处的字符应该与模式串以next[k]为下标的字符比较 //next[k]其实也是k处前与主串匹配的字符串的长度 int main() { int n; scanf("%d",&n); while(n--) { scanf("%d",&tlen); scanf("%s",t); MakeNext(); long long sum=0; memset(num,0,sizeof(num)); for(int i=1;i<=tlen;i++) { int tmp=Next[i]; while(tmp!=0) { num[tmp]++;//字符串长度为tmp的串匹配次数++ tmp=Next[tmp]; } } for(int i=0;i<tlen;i++) { sum=(sum+num[i]+1)%10007;//加上自己与自己匹配的1次 } cout<<sum<<endl; } return 0; }
相关文章推荐
- 结合友盟统计的多渠道快速打包
- C++和Java,绝不只是语法不同这么简单
- view第一次执行动画没效果,之后正常
- Openstack design
- mui
- SVN配置
- 糍粑大叔的独游之旅-u3d中2D轮廓的生成(上)
- Dijkstra算法(单源最短路径)C#版
- WebService的开发、部署、调用
- [Java基础笔记]JDBC初步
- AVL树增删查找
- ART世界探险(8) - 面向对象编程
- PM之数据分析与逻辑能力
- java中用集合编写简单的学生信息管理系统
- Linux内核编译与安装
- N的阶乘的准确值
- 【杭电】[2199]Can you solve this equation?
- Kconfig 、menuconfig、.config、Makefile之间的关系
- iOS开发(OC)——网络状态的检测
- android apk嵌套 从一个apk启动另外一个apk