bzoj3670 [Noi2014]动物园——KMP
2024-09-25 13:44:49
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3670
第一次写KMP算法...又T又WA了半天...
1. num 数组表示包括其本身的前缀后缀相同个数,所以 num[1] = 1 ;
2.指针开两个,不要一个来回移动,不然会惨 T;
num 数组、nxt 数组的定义一定要搞清楚才行呢...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const maxn=;
ll ans,mod=1e9+;
int n,nxt[maxn],num[maxn];
char a[maxn];
int rd()
{
int ret=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return ret*f;
}
int main()
{
n=rd();
while(n--)
{
// scanf("%s",&a+1);
cin>>a+;
int l=strlen(a+);
memset(nxt,,sizeof nxt);
memset(num,,sizeof num);
ans=; nxt[]=; num[]=;//
int nw=,nw2=;
for(int i=;i<=l;i++)
{
// int nw=nxt[i-1];
while(a[i]!=a[nw+]&&nw)nw=nxt[nw];
// if(nw==-1&&a[1]==a[i])nxt[i]=1;
// else
// nxt[i]=nw+1;
// nw=nxt[i];
if(a[i]==a[nw+])nw++;
nxt[i]=nw;
num[i]=num[nw]+;
// printf("num[%d]=%d\n",i,num[i]);
// printf("nxt[%d]=%d\n",i,nxt[i]);
while(a[i]!=a[nw2+]&&nw2)nw2=nxt[nw2];
if(a[i]==a[nw2+])nw2++;
while(nw2*>i)
{
// if(nw*2<=i)
// {
// num[i]=num[nw]+1;break;
// }
// cout<<nw<<endl;
nw2=nxt[nw2];
}
// printf("i:%d num=%d\n",i,num[i]);
(ans*=(num[nw2]+))%=mod;
}
printf("%lld\n",ans);
}
return ;
}
最新文章
- (五)SQL入门 数据库查询
- Clipboard.js – 现代方式实现复制文本到剪贴板
- for循环下九九乘法表
- next_permutation()函数 和 prev_permutation() 按字典序求全排列
- Django学习--9 多对一关系模型
- FZU-1921+线段树
- BZOJ 3672: [Noi2014]购票( 树链剖分 + 线段树 + 凸包 )
- Cannot mix incompatible Qt library (version 0x40801) with this library (version 0x40804)
- javascript (二) 事件
- Mysql实现企业级数据库主从复制架构实战
- HTML5学习知识点
- [Abp vNext 源码分析] - 文章目录
- thinkphp 响应对象
- 【vue】vue +element 搭建项目,组件之间通信
- 浏览器打开exe文件
- 获取China大陆IP段的范围
- TSP-UK49687
- QuickStart系列:docker部署之PostgreSQL
- python 深拷贝、浅拷贝、引用
- java中excel导入\导出工具类