bzoj 2555

 

暴力。

收获:

  1、第一道后缀自动机,大概知道怎么写了,有一些原理性的东西还要理解。

  2、计算right集合的大小

 

 1 /**************************************************************
 2     Problem: 2555
 3     User: idy002
 4     Language: C++
 5     Result: Accepted
 6     Time:4708 ms
 7     Memory:143072 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cstring>
12 #include <iostream>
13 #define fprintf(...)
14 #define N 1200010
15 using namespace std;
16  
17 int n, m;
18 char buf[N];
19 int aa[N], mask;
20 int son[N][26], par[N], val[N], siz[N], last, root, ntot;
21  
22 int newnode( int v ) {
23     int nd=++ntot;
24     val[nd] = v;
25     return nd;
26 }
27 void init() {
28     root = last = newnode(0);
29     siz[root] = 1;
30 }
31 void append( int c ) {
32     int p=last;
33     int np=newnode( val[p]+1 );
34     for( ; p && !son[p][c]; p=par[p] ) son[p][c] = np;
35     if( p==0 ) {
36         par[np] = root;
37     } else {
38         int q = son[p][c];
39         if( val[q]==val[p]+1 ) {
40             par[np] = q;
41         } else {
42             int nq = newnode( val[p]+1 );
43             memcpy( son[nq], son[q], sizeof(son[nq]) );
44             par[nq] = par[q];
45             siz[nq] = siz[q];
46             par[np] = par[q] = nq;
47             for( ; p && son[p][c]==q; p=par[p] ) son[p][c]=nq;
48         }
49     }
50     last = np;
51     for( ; np; np=par[np] ) ++siz[np];
52 }
53 void append( const char *T ) {
54     fprintf( stderr, "append( %s )\n", T );
55     for( ; *T; T++ )
56         append( *T-'A' );
57 }
58 void decode( int mask ) {
59     fprintf( stderr, "%d\n", mask );
60     int n = strlen(buf);
61     for( int j=0; j<n; j++ ) {
62         mask = (mask*131+j)%n;
63         swap( buf[j], buf[mask] );
64     }
65 }
66 int query( const char *T ) {
67     fprintf( stderr, "query( %s )\n", T );
68     int n=strlen(T);
69     int u=root;
70     for( int i=0; i<n; i++ ) {
71         int c=T[i]-'A';
72         if( !son[u][c] ) return 0;
73         u=son[u][c];
74     }
75     return siz[u];
76 }
77 int main() {
78     scanf( "%d", &m );
79     scanf( "%s", buf );
80     init();
81     append( buf );
82     for( int i=1; i<=m; i++ ) {
83         char ch[10];
84         scanf( "%s%s", ch, buf );
85         decode(mask);
86         if( ch[0]=='A' ) {
87             append(buf);
88         } else {
89             int ans = query(buf);
90             printf( "%d\n", ans );
91             mask ^= ans;
92         }
93     }
94 }
View Code

 

posted @ 2015-04-22 20:30  idy002  阅读(233)  评论(0编辑  收藏  举报