HDU5510(KMP)
2015-12-05 00:31
309 查看
2015ACM/ICPC沈阳赛区B题,现场赛用strstr函数暴力水过的。。。
题目大意:给你n个字符串,找出最大的i,使得在i之前的字符串都不是第i个串的子串。
注意数据量,减少kmp的次数,出现子串即不再进行匹配。
题目大意:给你n个字符串,找出最大的i,使得在i之前的字符串都不是第i个串的子串。
注意数据量,减少kmp的次数,出现子串即不再进行匹配。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; #define clr(a) memset((a),0,sizeof(a)) const int maxn=2222; char str[555][maxn]; int fa[maxn]; bool vis[maxn]; int alen,slen; int sum; void get_init(char *a) { clr(fa); alen=strlen(a); for(int i=1;i<alen;i++) { int j=fa[i]; while(j&&a[i]!=a[j]) { j=fa[j]; } fa[i+1]=(a[i]==a[j])?j+1:0; } } int kmp(char *str,char *a) { get_init(a); sum=0; slen=strlen(str); alen=strlen(a); int j=0; for(int i=0;i<slen;i++) { while(j&&str[i]!=a[j]) { j=fa[j]; } if(str[i]==a[j]) j++; if(j==alen) sum++; if(sum!=0) break; } return sum; } int main() { int T,kase=0; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",str[i]); } clr(vis); for(int i=1;i<n;i++) { if(kmp(str[i+1],str[i])!=0) vis[i]=1; } printf("Case #%d: ",++kase); for(int i=n;i>=1;i--) { for(int j=1;j<i;j++) { if(vis[j]) continue; kmp(str[i],str[j]); if(sum==0) { printf("%d\n",i); goto out; } } } printf("-1\n"); out:; } return 0; }
相关文章推荐
- JAVA随堂笔记课【一】:命名规范
- SQL 查询横表变竖表
- HTML初级教程
- Pthreads并行编程之spin lock与mutex性能对比分析
- python核心编程-可变参数3
- 调整数组中奇数偶数位置
- POJ3461(KMP模板题)
- 各种算法的性质
- [1000]:A + B Problem
- iOS之github第三方框架(持续更新)
- 远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合
- android增加自定义公用类库customer-framework.jar
- 一种存储数据的方法
- 黑马程序员------小练习
- cdoj 1250 喵哈哈的矩阵 数学题
- JAVA ClassLoader 介绍
- 关于keystone的一些问题:stop:unknow instance或unable to establish connection to http://controller:35357/v2.0/
- 关于某蔡傅里叶变换课的思考(元旦前更新)
- 操作系统核心原理-3.进程原理(中):进程调度
- [ecshop 经验] ecshop 后台 下载地址修改 excel下载地址修改