string matching
Posted liulex
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了string matching相关的知识,希望对你有一定的参考价值。
string matching
exkmp
#include<bits/stdc++.h> using namespace std; const int maxn=1000005; int Nex[maxn],extend[maxn]; void getNex(char str[]) int i=0,j,po,len=strlen(str); Nex[0]=len; while(str[i]==str[i+1]&&i+1<len) i++; Nex[1]=i; po=1; for(i=2; i<len; i++) if(Nex[i-po]+i<Nex[po]+po) Nex[i]=Nex[i-po]; else j=Nex[po]+po-i; if(j<0)j=0; while(i+j<len&&str[j]==str[j+i]) j++; Nex[i]=j; po=i; void Extend(char s1[],char s2[]) int i=0,j,po,len=strlen(s1),l2=strlen(s2); getNex(s2); while(s1[i]==s2[i]&&i<l2&&i<len) i++; extend[0]=i; po=0; for(i=1; i<len; i++) if(Nex[i-po]+i<extend[po]+po) extend[i]=Nex[i-po]; else j=extend[po]+po-i; if(j<0)j=0; while(i+j<len&&j<l2&&s1[j+i]==s2[j])j++; extend[i]=j; po=i; char s[1000005]; char t[1000005]; int main() freopen("1.in","r",stdin); int T; scanf("%d",&T); while(T--) memset(extend,0,sizeof extend); memset(Nex,0,sizeof Nex); scanf("%s",s); strcpy(t,s); Extend(s,t); int n=strlen(s); long long ans=0; //cout<<s<<t<<endl; for(int i=1; i<=n-2; i++) if(i+extend[i]==n) ans+=extend[i]; else ans+=extend[i]+1; //cout<<extend[i]<<" "<<i<<" "<<n-1<<‘\n‘; if(n>1) ans+=1; cout<<ans<<‘\n‘;
以上是关于string matching的主要内容,如果未能解决你的问题,请参考以下文章
Activity 类型的方法 managedQuery(Uri, String[], String, String[], String) 已弃用
Scala RDD[(String,String)] 到 RDD[String]