• UVA 257 Palinwords(hash)题解


    思路:给你字符串,如果他包含至少两个长度大于等于3的回文,并且这些回文不能嵌套(例如aaa嵌套在aaaa,waw嵌套在awawa),如果这个字符串这么牛逼的话,就输出他。

    思路:拿到字符串先正序hash和逆序hash,用来判断回文串。这里其实只要判断长度为3和4的回文就行,因为3,4大的可以嵌套在比他大的里面。一开始我还在想怎么区分aaa和aaaa,弄了个很复杂的东西,但是我发现其实只要储存回文串的半径的hash就行了!这样长度3和4也能比了。

    代码:

    #include<stack>
    #include<vector>
    #include<queue>
    #include<set>
    #include<cstring>
    #include<string>
    #include<sstream>
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #define ll long long
    #define ull unsigned long long
    using namespace std;
    const int maxn = 255+10;
    const int seed = 131;
    const int MOD = 100013;
    const int INF = 0x3f3f3f3f;
    char s[maxn];
    ull ha[2][maxn],bin[maxn];
    void init(){
        bin[0] = 1;
        for(int i = 1; i <= 255; i++)
            bin[i] = bin[i - 1] * seed;
    }
    void HASH(int len){
        ha[0][0] = 0;
        for(int i = 1; i <= len; i++)   //顺序
            ha[0][i] = ha[0][i - 1] * seed + s[i];
        ha[1][0] = 0;
        for(int i = len,j = 1; i >= 1; i--, j++)    //逆序
            ha[1][j] = ha[1][j - 1] * seed + s[i];
    }
    ull getsub(int l,int r,int id){
        return ha[id][r] - ha[id][l - 1] * bin[r - l + 1];
    }
    int main(){
        init();
        while(scanf("%s", s + 1) !=  EOF){
            int len = strlen(s + 1);
            HASH(len);
            int flag = -1;
            ull is;
            for(int i = 1; i <= len - 2; i++){
                ull suf = getsub(i, i + 1,0);   //顺序
                ull pre = getsub(len - (i + 2) + 1, len - (i + 1) + 1, 1);   //逆序
                if(suf == pre){
                    if(flag == -1){
                        is = suf;
                        flag = 0;
                    }
                    else if(suf != is){
                        flag = -2;
                        break;
                    }
                }
            }
            if(flag == -2){
                printf("%s
    ", s + 1);
                continue;
            }
            for(int i = 1; i<= len - 3; i++){
                ull suf = getsub(i, i + 1,0);   //顺序
                ull pre = getsub(len - (i + 3) + 1, len - (i + 2) + 1, 1);   //逆序
                if(suf == pre){
                    if(flag == -1){
                        is = suf;
                        flag = 0;
                    }
                    else if(suf != is){
                        flag = -2;
                        break;
                    }
                }
            }
            if(flag == -2){
                printf("%s
    ", s + 1);
                continue;
            }
        }
        return 0;
    }
  • 相关阅读:
    PHP的MySQL扩展:PHP访问MySQL的常用扩展函数
    PHP的MySQL扩展:MySQL数据库概述
    JQuery笔记:JQuery和JavaScript的联系与区别
    《千与千寻》给读者带来了什么?
    Canvas入门(3):图像处理和绘制文字
    Canvas入门(2):图形渐变和图像形变换
    Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形
    python第三十二天----6.3作业中…………
    python第三十一天-----类的封装、继承,多态.....
    python第三十天-类
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9524642.html
Copyright © 2020-2023  润新知