Acm解题技巧---Hash字符串

Hash字符串写起了很简单

第一题

点这里(第四小题)

第二题

UVA11475
题意: 让你在字符串后面加字符,使它成为最短的回文串
**题解:**可以后缀数组,马拉车,扩展kmp,然后想说的就是这个hash做法很好写,你分别从前往后,和从后往前hash这个串,然后每次你去判断下,如果相等,说明从str[i…len]的位置就是回文串,不然hash值怎么会相等,(排除这个hash值冲突情况),最后要求的是最短的回文串…

AC代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long int ll; 
typedef unsigned long long int ull;
template
inline T read(T&x){
    x=0;int f=0;char ch=getchar();
    while (ch<'0' || ch>'9') f|=(ch=='-'),ch=getchar();
    while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return x=f?-x:x;
}

int main()
{
    char s[1000100];
    while(~scanf("%s",s))
    {
        ull pow=1, base=1331, pre=0, suf=0, ans;
        int len = strlen(s);
        for(int i = len -1 ; i>=0; i--){
        	pre = pre * base + s[i];		//	从前算一个hash值 
        	suf = s[i] * pow + suf;			// 从后面算一hash值	
        	pow = pow *base;	
        	if(suf == pre)							
        		ans = i;
		}
        printf("%s",s);
        for(int i=ans-1; i>=0; i-- )
            putchar(s[i]);
        printf("\n");
    }
    return 0;
}

持续更新!!!

你可能感兴趣的:(Acm算法)