UVALive 3026 Period (KMP上的dp,学习ac自动机的前奏)
来源:互联网 发布:原生js点击事件 编辑:程序博客网 时间:2024/06/05 18:29
KMP上的dp问题,彻底明白kmp了,这道题脑补一下dp就出来了。
就不解释了,代码有些注释
推荐介绍kmp算法博客:http://blog.csdn.net/v_july_v/article/details/7041827
//Hello. I'm Peter.#include<cstdio>#include<iostream>#include<sstream>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<algorithm>#include<functional>#include<cctype>#include<ctime>#include<stack>#include<queue>#include<vector>#include<set>#include<map>using namespace std;typedef long long ll;typedef long double ld;#define peter cout<<"i am peter"<<endl#define input freopen("data.txt","r",stdin)#define randin srand((unsigned int)time(NULL))#define INT (0x3f3f3f3f)*2#define LL (0x3f3f3f3f3f3f3f3f)*2#define gsize(a) (int)a.size()#define len(a) (int)strlen(a)#define slen(s) (int)s.length()#define pb(a) push_back(a)#define clr(a) memset(a,0,sizeof(a))#define clr_minus1(a) memset(a,-1,sizeof(a))#define clr_INT(a) memset(a,INT,sizeof(a))#define clr_true(a) memset(a,true,sizeof(a))#define clr_false(a) memset(a,false,sizeof(a))#define clr_queue(q) while(!q.empty()) q.pop()#define clr_stack(s) while(!s.empty()) s.pop()#define rep(i, a, b) for (int i = a; i < b; i++)#define dep(i, a, b) for (int i = a; i > b; i--)#define repin(i, a, b) for (int i = a; i <= b; i++)#define depin(i, a, b) for (int i = a; i >= b; i--)#define pi 3.1415926535898#define eps 1e-6#define MOD 1000000007#define MAXN 1001000#define N#define M 4int n;char row[MAXN];int nextpos[MAXN];//kmp算法里的next数组,表示长度为i的串的最长前缀后缀的长度值int dp[MAXN][2];//dp[i][1]代表长度为i的前缀的K值是多少,即重复串出现的次数//dp[i][0]代表重复串的长度void build_nextpos(){//kmp算法中求next数组的经典操作 int i,j; i=0; j=-1; nextpos[0]=-1; while(i<n) { if(j==-1 || row[i]==row[j]) { nextpos[i+1]=j+1; i++; j=j+1; } else j=nextpos[j]; }}struct Answer{ int prefix_size; int k;}ans[MAXN];int num_ans;int main(){ int j,d,kase=1; while(~scanf("%d",&n) && n) { scanf("%s",row); build_nextpos(); num_ans=0; dp[0][0]=0; dp[0][1]=0; repin(i,1,n) { j=nextpos[i]; d=i-j; //d表示从j开始到i的长度 if(d==dp[j][0]) {//如果这个长度巧好等于我前缀后缀串的重复串的长度,那么我一定是周期串 dp[i][1]=dp[j][1]+1; dp[i][0]=dp[j][0]; } else//如果不等于,那么我本身是一个周期串,串的个数为1,长度为本身长度 { dp[i][1]=1; dp[i][0]=i; } //题意要求K>1的时候才算作答案输出 if(dp[i][1]>=2) { int t=++num_ans; ans[t].prefix_size=i; ans[t].k=dp[i][1]; } } printf("Test case #%d\n",kase++); repin(i,1,num_ans) { printf("%d %d\n",ans[i].prefix_size,ans[i].k); } printf("\n"); }}
0 0
- UVALive 3026 Period (KMP上的dp,学习ac自动机的前奏)
- poj 1625 AC自动机上的DP
- 第一次看AC自动机上的dp
- UVAlive 3026 Period [KMP]
- UVALIVE 3026 Period(kmp)
- HDU 3336 (KMP上的dp问题,ac自动机我来了)
- UVALive 3026 period(周期) kmp算法的应用
- UVALive - 3026 - Period (KMP)
- AC自动机的学习
- Poj 2778 /1625 / 3691 AC自动机上的DP
- AC自动机上的DP CF433E Tachibana Kanade's Tofu
- HDU3341 AC自动机上的状压DP
- HDU2457 DNA repair AC自动机上的简单DP
- HDU 2296 Ring AC自动机上的DP
- bzoj 1030: [JSOI2007]文本生成器 (ac自动机上的dp)
- poj--1625Censored!+AC自动机上的dp+大数
- UVALive 3490 Generator(AC自动机+dp+高斯消元)
- UVALive 4126 Password Suspects (AC自动机+DP)
- OpenCV基础篇之读取显示图片
- OpenCV基础篇之像素操作对比度调节
- DSP/BIOS使用之初窥门径——滴答时钟及烧写Flash
- PCB设计资料:看到最后才知道是福利
- LabVIEW上位机与串口通信
- UVALive 3026 Period (KMP上的dp,学习ac自动机的前奏)
- linker command failed with exit code 1 (use -v to see invocation)
- CentOS配置smaba与Windows共享文件
- 三极管的电平转换及驱动电路分析
- 对功率谱的一点理解
- 数组的指针特性
- DSP-BIOS使用入门
- ios添加admob 错误NSDecimalNumber gad_negativeOne
- 使用Tcl脚本分配FPGA管脚