KMP&&manacher模板題

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章