bzoj3409 [Usaco2009 Oct]Barn Echoes 牛棚回声

题目

n<=80什么鬼,其实如果n<=10000000还是可以做的,卡卡常,O(wys)233。

存两个哈希数组就好了,枚举长度判断。

#include
using namespace std;
int n,m,mx;
char s[105];
unsigned long long f[2][105],tmp,x,y; 
int main()
{
    freopen("in.txt","r",stdin);
    scanf("%s\n",s+1);n=strlen(s+1);
    for(int i=1;i<=n;i++)f[0][i]=f[0][i-1]*23+s[i];
    scanf("%s\n",s+1);m=strlen(s+1);
    for(int i=1;i<=m;i++)f[1][i]=f[1][i-1]*23+s[i];
    tmp=1;
    for(int i=1;i<=n;i++)
    {
        tmp*=23;
        x=f[0][i];
        if(i>m)break;
        y=f[1][m]-f[1][m-i]*tmp;
        if(x==y)mx=max(mx,i);
    }
    tmp=1;
    for(int i=1;i<=m;i++)
    {
        tmp*=23;
        x=f[1][i];
        if(i>n)break;
        y=f[0][n]-f[0][n-i]*tmp;
        if(x==y)mx=max(mx,i);
    } 
    cout<return 0;
}

你可能感兴趣的:(刷题总结,字符串与哈希)