1、hash模板
此题是求一个字符串的hash值即最后一个字符的hash值就是整个字符串的hash,此题一开始我没考虑用无符号溢出一直没过,再通过排序,相同的数只计入一个,所以再给计数赋初值不能赋0
#include<iostream>
#include<algorithm>
#include <string.h>
using namespace std;
const int max_n=20000;
unsigned long long mod=212370440130137957ll;
int prime=233317;
char a[max_n];
unsigned long long b=1;
unsigned long long ans[max_n];
unsigned long long dex(int c)
{
return c-'a'+1;
}
int main()
{
int n;
cin >> n;
for(int k=1;k<=n;k++)
{
cin >> a;
int j=strlen(a);
b=0;
for(int i=1;i<=j;i++)
{
b=((b*2333+dex(a[i-1]))%mod+prime);
}
ans[k]=b;
}
sort(ans+1,ans+n+1);
int key=1;
for(int i=1;i<n;i++)
{
if(ans[i]!=ans[i+1])
key++;
}
cout << key;
}
2 kmp模板
说是模板题,但是这是在一个字符串多次找相同的子串,在找下一个位置还是要利用到kmp算法的next数
#include<iostream>
#include<string.h>
using namespace std;
const int max_n=1e6+10;
char a[max_n],b[max_n];
int net[max_n];
int ans[max_n];
int n;
void getnet(char s[],int next[])
{
int i,j;
i=0;
j=-1;
next[0]=-1;
while(i<n)
{
if(j==-1||s[i]==s[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
cin >> a >> b;
n=strlen(b);
int m=strlen(a);
getnet(b,net);
int i=0;
int j=0;
int cont=0;
while(i<m)
{
if(j==-1||a[i]==b[j])
{
j++;
i++;
}
else j=net[j];
if(j==n)
{
ans[cont++]=i-n+1;
j=net[j];
}
}
for(int i=0;i<cont;i++)
cout << ans[i] << endl;
for(int i=1;i<=n;i++)
cout << net[i] << ' ';
}
组,不然时间超限
3、最长子序列
我用sum求最大值,max保存连续的子序列和,当max<1时就将max赋为0,此题注意可能为负,所以sum要赋一个负值