zoukankan      html  css  js  c++  java
  • 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 )
    ", T );
    55     for( ; *T; T++ )
    56         append( *T-'A' );
    57 }
    58 void decode( int mask ) {
    59     fprintf( stderr, "%d
    ", 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 )
    ", 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
    ", ans );
    91             mask ^= ans;
    92         }
    93     }
    94 }
    View Code
  • 相关阅读:
    f12 接口自动刷新页面 来不及看接口信息 前端有没有传值
    order by 分组报错 shop 有三个字段 根据author 选出最大的price
    mybatis 动态sql
    正则 只有英文或者数字 长度6位以上 数字或者英文全部一样
    sql :1 :2
    前端Json数据,后台String接收,如何解析
    Json数据格式化
    LeetCode63. 不同路径 II
    LeetCode62. 不同路径
    LeetCode746. 使用最小花费爬楼梯
  • 原文地址:https://www.cnblogs.com/idy002/p/4448567.html
Copyright © 2011-2022 走看看