hdu 5510 Bazinga (KMP+暴力标记)
Posted kls123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5510 Bazinga (KMP+暴力标记)相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510
思路:
一开始直接用KMP莽了发,超时了,后面发现如果前面的字符串被后面的字符串包含,那么我们就不需要用前面的字符串去比较了,把他标记掉就好了。
实现代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; char s[505][2050]; int vis[510]; int next1[2050]; int slen,tlen; void get_next(char *mat) { int j,k; tlen=strlen(mat); j=0;k=-1;next1[0]=-1; while(j<tlen) { if(k==-1||mat[j]==mat[k]) next1[++j]=++k; else k=next1[k]; } } int kmp_pos(char *str,char *mat) { int i=0,j=0; slen=strlen(str); get_next(mat); while(i<slen&&j<tlen) { if(j==-1||str[i]==mat[j]) { i++;j++; } else j=next1[j]; } if(j==tlen) return i-tlen; return -1; } int main() { int tt,n; int ttt=0; scanf("%d",&tt); while(tt--) { ttt++; int sum=-1; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s[i]); vis[i] = 1; } int flag=0; int st = 1; for(int i = 2;i <= n;i ++){ int ans=kmp_pos(s[i],s[i-1]); if(ans != -1) vis[i-1] = 0; } for(int i=n;i>=1;i--) { flag=0; for(int j=i-1;j>=1;j--) { if(vis[j]==0) continue; int ans=kmp_pos(s[i],s[j]); if(ans==-1) { flag=1;break; } } if(flag==1) { sum=i;break; } } printf("Case #%d: ",ttt); printf("%d ",sum); } }
以上是关于hdu 5510 Bazinga (KMP+暴力标记)的主要内容,如果未能解决你的问题,请参考以下文章