Description
You is given a number of case-sensitive strings of alphabetic characters, find the largest string x, such that either X, Or its inverse can is found as a substring of any of the given strings.
Input
The first line of the input contains a single integer t (1 <= t <=), the number of test cases, followed by the Put data for each test case. The first line of all test case contains a single integer n (1 <= n <=), the number of given strings, followed by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string.
Output
There should is one line per test case containing the length of the largest string found.
Sample Input
23abcdbcdffbrcd2roseorchid
Sample Output
Source
Tehran 2002 Preliminary
Test instructions: Given n strings, the oldest string that appears in each string after a occurrence or reversal. Idea: First write each string in reverse, in the middle with a different
And does not appear in the string of characters separated, and then the n strings are all linked together, the middle is also a
An array of suffixes that are not identical and are separated from characters that do not appear in the string. And then the two-point answer,
The suffixes are then grouped. When judging, see if there is a set of suffixes in each original string or after reversal
Appears in the string.
#include <iostream> #include <stdio.h> #include <string.h> #include <stack> #include <queue > #include <map> #include <set> #include <vector> #include <math.h> #include <bitset># Include <algorithm> #include <climits>using namespace std; #define LS 2*i#define RS 2*i+1#define Up (i,x,y) for (i=x;i<=y;i++) #define DOWN (i,x,y) for (i=x;i>=y;i--) #define MEM (a,x) memset (A,x,sizeof (a)) #define W (a) while (a) #define GCD (A, B) __gcd (A, b) #define LL long long#define N 1000005#define MOD 1000000007#define INF 0x3f3f3f3f#define EXP 1e -8int Wa[n],wb[n],wsf[n],wv[n],sa[n];int Rank[n],height[n],s[n],a[n];//sa: The starting position of the rank I bit in the dictionary sequence is sa[i]//rank in str: That is, the suffix of the str i position is the longest common prefix int cmp (int *r,int a,int b,int k) in the dictionary sequence//height: The suffix of the dictionary sequence I and the i-1 {return r[a]==r[b]&&r[a+k] ==R[B+K];} void Getsa (int *r,int *sa,int n,int m)//n to include the 0{int i,j,p,*x=wa,*y=wb,*t added at the end; for (i=0; i<m; i++) wsf[i]=0; for (i=0; i<n; i++) wsf[x[i]=r[i]]++; for (I=1; i<m; i++) wsf[i]+=wsf[i-1]; for (i=n-1; i>=0; i--) sa[--wsf[x[i]]]=i; P=1; J=1; for (; p<n; j*=2,m=p) {for (p=0,i=n-j; i<n; i++) y[p++]=i; for (i=0; i<n; i++) if (sa[i]>=j) y[p++]=sa[i]-j; for (i=0; i<n; i++) wv[i]=x[y[i]; for (i=0; i<m; i++) wsf[i]=0; for (i=0; i<n; i++) wsf[wv[i]]++; for (I=1; i<m; i++) wsf[i]+=wsf[i-1]; for (i=n-1; i>=0; i--) sa[--wsf[wv[i]]]=y[i]; T=x; X=y; y=t; x[sa[0]]=0; for (P=1,i=1; i<n; i++) x[sa[i]]=cmp (y,sa[i-1],sa[i],j)? p-1:p++; }}void getheight (int *r,int n)//n does not save the last 0{int i,j,k=0; for (I=1; i<=n; i++) rank[sa[i]]=i; for (i=0; i<n; i++) {if (k) k--; else k=0; J=SA[RANK[I]-1]; while (R[i+k]==r[j+k]) k++; Height[rank[i]]=k; }}char str[n];int len[105],size,ans[n],id[n];bool vis[105];bool Check (int mid,int n,int k) {int i,j;int size = 0,CNT = 0; MEM (Vis,false); for (i = 1; i<=n; i++) {if (Height[i]>=mid) {for (j = 0; j<k; j + +) { if (id[sa[i]]==j) cnt+= (vis[j]?0:1), vis[j]=true; if (id[sa[i-1]]==j) cnt+= (vis[j]?0:1), vis[j]=true; }} else {if (cnt>=k) return true; CNT = 0; MEM (Vis,false); }} if (cnt>=k) return true; return false;} int main () {int n,k,i,j,flag = 0,t; scanf ("%d", &t); while (t--) {scanf ("%d", &k); n = 0; size = 0; int p = 1; for (i = 0; i<k; i++) {scanf ("%s", str); int LL = strlen (str); for (j = 0; j<ll; j + +) {Id[n] = i; s[n++] = Str[j]; } s[n++] = ' # ' + (p++); for (j = ll-1; j>=0; j--) {Id[n] = i; s[n++] = Str[j]; } s[n++] = ' # ' + (p++); } s[n-1] = 0; Getsa (s,sa,n,255); GetHeight (s,n-1); int L=1,r=n,mid,ans = 0; while (l<=r) {mid = (l+r)/2; if (check (mid,n,k)) {ans = mid; L = mid+1; } else R = mid-1; } printf ("%d\n", ans); } return 0;}
poj1226:substrings (suffix array)