poj3007 Organize Your Train part II, 字符串hash

题意:

给定一个字符串,从任意位置把它切为两半,得到两条子串

定义 子串1为s1,子串2为s2,子串1的反串为s3,子串2的反串为s4

现在从s1 s2 s3 s4中任意取出两个串组合,问有多少种不同的组合方法

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#define for0(a,b) for(a=0;a<b;++a)
#define for1(a,b) for(a=1;a<=b;++a)
#define foru(i,a,b) for(i=a;i<=b;++i)
#define ford(i,a,b) for(i=a;i>=b;--i)
using namespace std;

typedef double db;
typedef long long ll;
const db eps = 1e-8;
const int inf = 1e9;
const int M = 1e4;
const int maxn = 80;

char s[maxn], p[maxn], q[maxn], rp[maxn], rq[maxn], str[maxn];
char val[M][maxn];
int cnt, n;

//BKDR Hash Function
int hash(char *v){
    unsigned int seed = 131;
    unsigned int hash = 0;
    for(int i=0; v[i]; ++i)
        hash = hash * seed + v[i];
    return (hash & 0x7FFFFFFF) % M;
}

void contact(char *a, char *b){
    int k = 0;
    for(int i=0; a[i]; ++i) str[k++] = a[i];
    for(int i=0; b[i]; ++i) str[k++] = b[i];
    str[k] = '\0';
}

void insert(char *a, char *b){
    contact(a, b);
    int k = hash(str);
    while( (strlen(val[k])>0) && strcmp(str,val[k])!=0){
        k = (k+1) % M;
    }
    if(strlen(val[k])== 0){
        strcpy(val[k], str);
        cnt++;
    }
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.cpp", "r", stdin);
    freopen("out.cpp","w", stdout);
#endif // ONLINE_JUDGE
    int n, i, j;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%s", s);
        for0(i,M) val[i][0]='\0';
        int len = strlen(s);
        int k;
        cnt = 0;
        for1(i,len-1) {
            k = 0;
            for0(j,i){
                p[j] = s[j];
                rp[k++] = s[i-j-1];
            }
            p[k] = rp[k] = '\0';
            k = 0;
            foru(j,i,len-1) {
                q[j-i] = s[j];
                rq[k] = s[len-k-1];
                ++k;
            }
            q[k] = rq[k] = '\0';
            insert(p, q); insert(q, p);
            insert(p, rq); insert(rq, p);
            insert(q, rp); insert(rp, q);
            insert(rp, rq); insert(rq, rp);
        }
        printf("%d\n", cnt);
    }
    return 0;
}
时间: 2024-10-15 18:35:15

poj3007 Organize Your Train part II, 字符串hash的相关文章

POJ3007(Organize Your Train part II)

传送门 Organize Your Train part II Time Limit: 1000MS   Memory Limit: 65536K       Description RJ Freight, a Japanese railroad company for freight operations has recently constructed exchange lines at Hazawa, Yokohama. The layout of the lines is shown i

POJ 3007 Organize Your Train part II

题意: 如上图所示,将一个字符串进行分割,反转等操作后不同字符串的个数: 例如字符串abba:可以按三种比例分割:1:3:2:2:3:1 部分反转可以得到如下所有的字符串: 去掉重复可以得到六个不同的字符串,输出6: 解题思路: 此题用反转函数reverse比较方便,然后就和模拟差不多,要列出所有情况,把不同的字符串保存在一个字符数组中,每次得到一个字符串都和该字符数字中的每一个比较,如果都不相同,把它存入字符数组:. 直接看代码吧: 1 //Organize Your Train part I

poj3007--Organize Your Train part II(hash)

Organize Your Train part II Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7365   Accepted: 2130 Description RJ Freight, a Japanese railroad company for freight operations has recently constructed exchange lines at Hazawa, Yokohama. The

转载:字符串hash总结(hash是一门优雅的暴力!)

转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæ?] 美[hæ?]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟; 我觉得Hash是引申出 把...弄乱 的意思. 今天就来谈谈Hash的一种——字符串hash. 据我的理解,Hash就是一个像函数一样的东西,你放进去一个值,它给你输出来一个值.输出的值就是Hash值.一般Hash值会比原来的值更好储存(更小)或比较. 那字符串Hash就非常好理解了.就是把字符

字符串Hash总结(转载)

转载地址 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæ?] 美[hæ?] n. 剁碎的食物; #号; 蔬菜肉丁; vt. 把…弄乱; 切碎; 反复推敲; 搞糟; 我觉得Hash是引申出 把...弄乱 的意思. 今天就来谈谈Hash的一种——字符串hash. 据我的理解,Hash就是一个像函数一样的东西,你放进去一个值,它给你输出来一个值.输出的值就是Hash值.一般Hash值会比原来的值更好储存(更小)或比较. 那字符串Hash就非常好理解了.就是把字符串转换成一个整数的函数.而

hdu 1880 魔咒词典(字符串hash)

题目链接:hdu 1880 魔咒词典 题意: 给你一个10w的词典,让你输出对应的字段. 题解: map暴力存字符串肯定会卡内存,这里用BKDR字符串hash一下,用map映射一下. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef unsigned long long ull; 5 6 const int N=1e5+7,seed=133

【二分答案+智障的字符串hash】BZOJ2946-[Poi2000]公共串(Ranklist倒一达成!!!!!)【含hash知识点】

[题目大意] 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. [字符串hash的小笔记] hash[i]=(hash[i-1]*p+idx(s[i]))%mod,idx为映射值,一般a..z映射1..26: 习惯上,p取一个6到8位的素数即可,mod一般取大素数 1e9+7(1000000007)或1e9+9(1000000009). hash[i]=(hash[i-1]*p+idx(s[i]))%mod 表示第 i 个前缀的hash值,是一个hash的前缀和,那么,要求S[l…r]

Train Problem II 卡特兰裸题(入门题)

Train Problem II  题目大意:给你一个数n,表示有n辆火车,编号从1到n,从远方驶过来,问你有多少种出站的可能. 解题思路:模拟栈的问题而已.  卡特兰问题. 1 import java.math.*; 2 import java.util.*; 3 import java.io.*; 4 5 public class Main 6 { 7 static int MS=101; 8 public static void main(String[] args) 9 { 10 Sca

hdu4821 String 字符串hash(bkdrhash)

题意:给定m,l,一个字符串str. 我们定义一个子串为"recoverable"串 当 1.长度为 M*L 2.把这个好串分成M段,每段长度为L,且每段各不相同. 求"recoverable"串的个数,串相同位置不同也算不同. 思路:预处理数组hash,hash[i]表示从i位置到尾的字符串hash值.这里数组为unsigned long long型,因为可以自动取模.然后枚举 前l个位置,每次向后翻滚(将前一个长度为l的段hash值从map中去除,将翻滚后新出现