• 【HDOJ6629】string matching(exkmp)


    题意:给定一个长为n的字符串,求其每个位置开始于其自身暴力匹配出相同或不同的结果的总比较次数

    n<=1e6

    思路:exkmp板子

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 typedef unsigned int uint;
     5 typedef unsigned long long ull;
     6 typedef pair<int,int> PII;
     7 typedef pair<ll,ll> Pll;
     8 typedef vector<int> VI;
     9 typedef vector<PII> VII;
    10 //typedef pair<ll,ll>P;
    11 #define N  1000010
    12 #define M  200010
    13 #define fi first
    14 #define se second
    15 #define MP make_pair
    16 #define pb push_back
    17 #define pi acos(-1)
    18 #define mem(a,b) memset(a,b,sizeof(a))
    19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
    20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
    21 #define lowbit(x) x&(-x)
    22 #define Rand (rand()*(1<<16)+rand())
    23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
    24 #define ls p<<1
    25 #define rs p<<1|1
    26 
    27 const int MOD=1e9+7,inv2=(MOD+1)/2;
    28       double eps=1e-4;
    29       int INF=1e9;
    30       int inf=0x7fffffff;
    31       int dx[4]={-1,1,0,0};
    32       int dy[4]={0,0,-1,1};
    33 
    34 int nxt[N],ext[N];
    35 char s[N],t[N];
    36 
    37 int read()
    38 {
    39    int v=0,f=1;
    40    char c=getchar();
    41    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
    42    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
    43    return v*f;
    44 }
    45 
    46 
    47 int main()
    48 {
    49     int cas=read();
    50     while(cas--)
    51     {
    52         int n,m;
    53         //scanf("%s",s+1);
    54         scanf("%s",t+1);
    55         //n=strlen(s+1);
    56         m=strlen(t+1);
    57         nxt[1]=m;
    58         int id=0,p=0;
    59         rep(i,2,m)
    60         {
    61             int j=nxt[i-id+1];
    62             if(i+j>p)
    63                 for(j=max(p-i,0);i+j<=m&&t[j+1]==t[i+j];j++);
    64             nxt[i]=j;
    65             if(i+j-1>p)
    66                 id=i,p=i+j-1;
    67         }
    68         ll ans=0;
    69         rep(i,2,m)
    70          if(nxt[i]+i>m) ans+=nxt[i];
    71           else ans+=(nxt[i]+1);
    72         /*id=p=0;
    73         for(int i=1;i<=n;i++)
    74         {
    75             int j=nxt[i-id+1];
    76             if(i+j>p)
    77                 for(j=max(p-i,0);i+j<=n&&t[j+1]==s[i+j];j++);
    78             ext[i]=j;
    79             if(i+j-1>p) id=i,p=i+j-1;
    80         }
    81         for(int i=1;i<=m;i++) printf("%d ",nxt[i]);
    82         printf("
    ");
    83         for(int i=1;i<=n;i++) printf("%d ",ext[i]);
    84         printf("
    ");*/
    85         printf("%I64d
    ",ans);
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    学习博客
    file-max与ulimit的关系与差别
    buffer cache chain 图
    计算机体系结构 ---图2
    计算机体系结构-图
    工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files
    Linux Kernel: buffers和cached的区别
    lnux内核的malloc实现(Oracle的cache buffer影子)
    内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
    Linux 内核的文件 Cache 管理机制介绍-ibm
  • 原文地址:https://www.cnblogs.com/myx12345/p/11648501.html
Copyright © 2020-2023  润新知