「模板」字符串
Hash
#include<cstdio>
#include<iostream>
#include<cstring>
#define re register
using namespace std;
typedef unsigned long long ull;
const int N=200005,base=131;
int T,la,lb;
ull power[N],ha[N],hb[N];
char A[N],B[N],ed[3];
inline void ini()
{
for(int i=0;i<=la;i++)
ha[i]=hb[i]=0;
}
inline void work()
{
scanf("%d%d",&la,&lb);
scanf("%s",A+1);
scanf("%s",ed);
ini();
for(re int i=1;i<=lb;i++)
B[i]=A[i];
B[++lb]=ed[0];
for(re int i=1;i<=lb;i++)
hb[i]=hb[i-1]*base+B[i];
for(re int i=1;i<=la;i++)
ha[i]=ha[i-1]*base+A[i];
//debug();while(1);
int ans=0;
for(re int i=1;i<=min(la,lb);i++)
{
if(i==1)
{
if(A[1]==B[lb])ans=1;
continue;
}
if(ha[i]==hb[lb]-hb[lb-i]*power[i])
ans=max(ans,i);
//cout<<geta(1,i)<<' '<<getb(lb-i+1,lb)<<endl;
}
printf("%d\n",ans);
}
int main()
{
scanf("%d",&T);
power[0]=1;
for(re int i=1;i<=N;i++)
power[i]=power[i-1]*base;
while(T--)work();
return 0;
}
KMP
Trie
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=10010;
int T,trie[N*10][11],now=1,n;
char str[55];
bool end[N*10];
bool ins(char *s)
{
int len=strlen(s),p=1;
for(int i=0;i<len;i++)
{
int x=s[i]-'0';
if(!trie[p][x])trie[p][x]=++now;
p=trie[p][x];
if(end[p])return 1;
}
end[p]=1;
for(int i=0;i<=9;i++)if(trie[p][i])return 1;
return 0;
}
void work()
{
memset(trie,0,sizeof(trie));
memset(end,0,sizeof(end));
scanf("%d",&n);
bool res=0;
now=1;
for(int i=1;i<=n;i++)
{
scanf("%s",str);
bool t=ins(str);
if(t==1&&res==0)
{
puts("NO");res=1;
}
}
if(!res)puts("YES");
}
int main()
{
scanf("%d",&T);
while(T--)work();
return 0;
}
AC自动机
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 10010
#define maxl 1000100
using namespace std;
int n;
char s[maxl];
struct ac_automation
{
int tot;
struct node
{
node *son[26];//记录儿子
int size;//儿子数
node *fail;//失配指针
node ()
{
memset(this,0,sizeof(node));
}
};
node *root;
inline void init()
{
root=new node();
}
inline void insert()
{
int l=strlen(s+1),i=1;
node *now=root;
while(i<=l)
{
if(!now->son[s[i]-'a'])now->son[s[i]-'a']=new node();
now=now->son[s[i]-'a'];
i++;
}
now->size++;
}
inline void build()
{
queue <node*> q;
for(int i=0;i<26;i++)
{
if(root->son[i])
{
q.push(root->son[i]);
root->son[i]->fail=root;
}
else root->son[i]=root;
}
while(!q.empty())
{
node *x=q.front();
q.pop();
for(int i=0;i<26;i++)
{
if(x->son[i])
{
x->son[i]->fail=x->fail->son[i];
q.push(x->son[i]);
}
else x->son[i]=x->fail->son[i];
}
}
}
inline int query()
{
node *now=root;
int i=1,l=strlen(s+1),ans=0;
while(i<=l)
{
now=now->son[s[i]-'a'];
for(node *j=now;j!=root&&j->size!=-1;j=j->fail)
{
ans+=j->size;
j->size=-1;
}
i++;
}
return ans;
}
}ac;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ac.init();//千万别忘了
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
ac.insert();
}
ac.build();
scanf("%s",s+1);
printf("%d\n",ac.query());
}
return 0;
}
兴许青竹早凋,碧梧已僵,人事本难防。

浙公网安备 33010602011771号