Bazinga HDU - 5510 (暴力)
2017-08-30 20:53
399 查看
题意:
给你n(1<=n<=500)个长度最多为2000的字符串,现在让你找出最大的i使得存在j(1<=j思路:
直接暴力比较每个字符串是不是当前考虑的这个字符串的子串,然后加上一个优化就是从最近的一个字符串开始,这个字符串满足其前面的字符串都是当前串的子串,然后还有就是如果待比较的字符串长度明显不满足直接返回false。然后判断是不斯匹配我写了一个KMP,不知道不用KMP能不能过代码:
#include<cstring> #include<cctype> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn=500+10; const int maxlen=2000+10; char str[maxn][maxlen]; int kase=0; void solve(); bool check(char * s,char * t); int main() { int T; kase=0; scanf("%d",&T); while(T--){ kase++; solve(); } return 0; } void solve() { int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",str[i]); } int ans=-1; int pre=1; bool flag; for(int i=2;i<=n;i++){ flag=true; for(int j=pre;j<i;j++){ if(!check(str[j],str[i])){ ans=max(ans,i); flag=false; break; } } if(flag){ pre=max(pre,i); } } printf("Case #%d: %d\n",kase,ans); } void getfail(char * s,int n,int * f); bool check(char * s,char * t) { int n=strlen(s),m=strlen(t); if(n>m) return false; static int fail[maxlen]; getfail(s,n,fail); int j=0; for(int i=0;i<m;i++){ while(j&&s[j]!=t[i]) j=fail[j]; if(s[j]==t[i]) j++; if(j==n) return true; } return false; } void getfail(char * s,int n,int * f) { f[0]=0; f[1]=0; int j=0; for(int i=1;i<n;i++){ j=f[i]; while(j&&s[j]!=s[i]) j=f[j]; if(s[j]==s[i]) j++; f[i+1]=j; } }
相关文章推荐
- hdu 5510 Bazinga(暴力)
- hdu 5510 Bazinga【KMP+暴力剪枝】
- HDU5510 Bazinga 暴力strstr+剪枝
- hdu5510 Bazinga 暴力+剪枝
- HDU - 5510 Bazinga(暴力剪枝 + KMP || strstr)
- HDU 5510 Bazinga 暴力匹配加剪枝
- HDU5510 - Bazinga (kmp+暴力)
- HDU-5510 Bazinga(KMP)
- HDU 5510 Bazinga 字符串HASH (2015ACM/ICPC亚洲区沈阳站)
- HDU 5510 Bazinga 【kmp】
- HDU 5510 Bazinga 多种姿势
- Bazinga HDU - 5510
- HDU 5510 Bazinga (2015沈阳站B题&&KMP)
- HDU 5510 Bazinga 双指针+KMP.
- HDU - 5510(暴力)
- HDU 5510 Bazinga (字符串匹配)
- HDU 5510 Bazinga(2015亚洲区沈阳站现场赛)
- HDU-5510 Bazinga、HDU-5521 Meeting
- HDU 5510 Bazinga (KMP)
- hdu 5510 Bazinga 2015ACM/ICPC亚洲区沈阳站-重现赛