P6724 题解

· · 题解

题意分析

给定字符串,求最小词根。

解题方法

枚举词根的长度,切片并判断哈希值即可。

AC 代码

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int hash_str(string k){
    int ans=0;
    for(int i=0;i<k.size();++i)
        ans+=k[i]*k[i];
        //普通的进制哈希无法判断两个字符串字母改变顺序后能否完全相同
        //如 "ab" 与 "ba" 的哈希值是不相等的 
        //故计算字符串每一位的 Ascii 码值的平方之和 
    return ans;
}
signed main(){
    string k;
    cin>>k;
    int sizeof_k=k.size();
    for(int i=1;i<=k.size()-1;++i){     //枚举词根长度 
        if(sizeof_k%i==0){   
            int xb=i;
            bool kk=true;
            int right=hash_str(k.substr(0,i));    //词根哈希值 
            while(xb<sizeof_k){
                if(hash_str(k.substr(xb,i))!=right){
                    kk=false;
                    break;
                }
                xb+=i;
            }
            if(kk==true){     
                cout<<k.substr(0,i);
                return 0;
            }
        }
    }
    cout<<-1;
}