int lcs(char* s,char* t) { int l1 = strlen(s); int l2 = strlen(t); sa_init( ); for(int i=0;i < l1;i++) sa_extend(s[i]); int v = 0,l = 0,best = 0,bestpos = 0; for(int i=0;i < l2;i++) { while(v && !st[v].next.count(t[i])) { v = st[v].link; l = st[v].len; } if(st[v].next.count(t[i])) { v = st[v].next[t[i]]; ++l; } if(l > best) best = l,bestpos = i; } return best; }
string lcs(string s,string t) { sa_init( ); for(int i=0;i<(int)s.length( );i++) sa_extend(s[i]); int v = 0,l = 0,best = 0,bestpos = 0; for(int i=0;i<(int)t.length();i++) { while(v && !st[v].next.count(t[i])) { v = st[v].link; l = st[v].len; } if(st[v].next.count(t[i])) { v = st[v].next[t[i]]; ++l; } if(l > best) best = l,bestpos = i; } return t.substr(bestpos - best + 1,best); }
string lcs ( string s, string t ) { sa_init ( ) ; int slen = s.length() , tlen = t.length() ; rep(i,slen) sa_extend ( s [ i ] ) ; int v = 0 , l = 0 , best = 0 , bestpos = 0 ; rep(i,tlen) { while ( v && ! st [ v ] . next.count ( t[i] ) ) { v = st [v].link ; l = st [v].len ; } if ( st [v] . next.count ( t[i] ) ) { v = st [v].next [ t [i] ] ; ++l ; } if ( l > best ) best = l, bestpos = i ; } return t. substr ( bestpos - best + 1 , best ) ; }
int main() { long start_time = clock(); size_t size, last; std::vector<state> states = sa_init(size, last); char c; while (std::cin.get(c)) { if(c == '\n') break; sa_extend(states, size, last, c); } std::vector<long long> visited_st(2*last, -1); // cache for calculated states long long m = count_for_st(visited_st, states, 0); std::cout << m << std::endl; long total_time = clock() - start_time; char buffer[50]; sprintf(buffer, "Total time: %ld", total_time); LOG(1, buffer); return 0; }
void process(const string &s) { sa_init(); forn(i,si(s)) sa_extend(s[i]); }