hdu1686 kmp模板
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
char w[10005],t[1000005];
int next[10005],wsize,tsize,cnt;
void getnext()
{
int i=0,j=-1;
next[0]=-1;
while(i<wsize)
{
if(j==-1||w[i]==w[j])
{
i++;
j++;
if(w[i]==w[j])
next[i]=next[j];
else
next[i]=j;
}
else
j=next[j];
}
}
void kmp()
{
int i=0,j=0;
while(i<tsize)
{
if(t[i]==w[j])
{
i++;
j++;
if(j==wsize)
cnt++;
}
else
{
j=next[j];
if(j==-1)
{
i++;
j=0;
}
}
}
}
int main()
{
int n;
cin >> n;
while(n--)
{
cnt=0;
cin >> w >> t;
tsize=strlen(t);
wsize=strlen(w);
getnext();
kmp();
cout << cnt << endl;
}
return 0;
}
hdu3294 manacher模板
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=2e5+5;
char s[maxn*2],s1[maxn*2];
int p[maxn*2];
int main()
{
char ch;
while(scanf("%c %s",&ch,s)!=EOF)
{
getchar();
int cnt=ch-'a';
int len=strlen(s);
int l,r;
for(int i=0;i<len;i++)
{
s[i]=s[i]-cnt;
if(s[i]<'a')
{
int n='a'-s[i];
s[i]='z'-n+1;
}
}
strcpy(s1,s);
for(int i=len;i>=0;i--)
{
s[i+i+2]=s[i];
s[i+i+1]='#';
}
int mx=0,id=0,maxlen=-1,id_max;
s[0]='$';
for(int i=2;i<len*2+1;i++)
{
if(mx>i)
p[i]=min(p[id*2-i],mx-i);
else
p[i]=1;
while(s[i-p[i]]==s[i+p[i]])
p[i]++;
if(mx<p[i]+i)
{
id=i;
mx=p[i]+i;
}
if(maxlen<p[i])
{
id_max=id;
maxlen=p[i];
l=(i-p[i])/2;
r=(i+p[i])/2-2;
}
}
// cout << maxlen << id_max << endl;
if(maxlen==2)
cout << "No solution!" << endl;
else
{
cout<<l<<" "<<r<<endl;
for(int i=l;i<=r;i++)
{
printf("%c",s1[i]);
}
cout<<endl;
}
}
return 0;
}