Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 593 Accepted Submission(s): 241
题意:n个字符串,s[i] (1≤i≤n),找到最大的i,是得存在j(1≤j<i)使得,s[j]不是 s[i]的子串。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char s[550][2200]; int Next[550][2200]; int Judge(int w, int o) { int i = 0 , j = 0; int l1, l2; l1 = strlen(s[w]); l2 = strlen(s[o]); while(i < l1 && j < l2) { if(s[w][i] == s[o][j] || i == -1) { i++; j++; } else i = Next[w][i]; if(i == l1) { return true; } } return false; } void getNext(int q) { int j, k; int i = strlen(s[q]); j = 0; k = -1; Next[q][0] = -1; while(j < i) { if(k == -1 || s[q][j] == s[q][k]) { j++; k++; Next[q][j] = k; } else k = Next[q][k]; } } int main() { int t, n, index, l = 1; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%s", s[i]); getNext(i); } index = -1; int q; for(int i = n-2; i >= 0; i--) { if(!Judge(i, i+1)) 找到一个字符串不满足前后是子串关系后,从后向前找最大的不满足子串的串 { q = i; for(int j = n-1; j > q; j--) { if(!Judge(q, j)) index = index > j ? index : j; } } } if(index == -1) printf("Case #%d: %d\n", l++, index); else printf("Case #%d: %d\n", l++, index+1); } return 0; }
strstr阔以考虑……脉动回来
原文:http://www.cnblogs.com/Tinamei/p/4938900.html