From 1d1598fdc2c1df5fdac0b9efe85ee62274c3566b Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Fri, 28 Nov 2025 14:05:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=93=88?= =?UTF-8?q?=E5=B8=8C):=20=E9=87=8D=E6=9E=84=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E5=93=88=E5=B8=8C=E5=AE=9E=E7=8E=B0=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将P3370.cpp从src/2移动到src/11/28目录并重构实现 新增P3375.cpp实现字符串匹配和回文前缀查找功能 使用更简洁的代码风格和更高效的哈希算法 --- src/11/28/P3370.cpp | 32 +++++++++++++++++++ src/11/28/P3375.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++++ src/2/P3370.cpp | 38 ----------------------- 3 files changed, 108 insertions(+), 38 deletions(-) create mode 100644 src/11/28/P3370.cpp create mode 100644 src/11/28/P3375.cpp delete mode 100644 src/2/P3370.cpp diff --git a/src/11/28/P3370.cpp b/src/11/28/P3370.cpp new file mode 100644 index 0000000..aa9fd9b --- /dev/null +++ b/src/11/28/P3370.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +using ll = int64_t; + +const ll b=233,p=1e9+7; + +ll n; +std::string tmp; +std::set s; + +static inline ll strhash(std::string &s){ + ll res=0; + for(ll i=0;i>n; + for(ll i=1;i<=n;i++){ + std::cin>>tmp; + s.emplace(strhash(tmp)); + } + std::cout< +#include +#include +#include +#include +#include +#include +using ll = int64_t; +#define printf +#define sl static inline + +const ll b=233,p=1e9+7; +std::string s1,s2; +ll n1,n2,h2; +std::vector v1,bp,v2,v2r; + +sl ll strhash(std::string&s){ + ll res=0; + for(ll i=0;i>s1>>s2; + h2=strhash(s2); + n1=s1.size(),n2=s2.size(); + s1=' '+s1;s2=' '+s2; + v1.resize(s1.size()); + v2.resize(s2.size()); + v2r.resize(s2.size()+1); + bp.resize(std::max(s1.size(),s2.size())); + bp[0]=1; + for(ll i=1;i=1){ + ll h1=(v1[i]-v1[s-1]*bp[n2]%p+p)%p; + printf("v1=%lld, h1=%lld, h2=%lld\n",v1[i],h1,h2); + if(h1==h2){ + std::cout<=1;i--){ + v2r[i]=(v2r[i+1]*b+s2[i])%p; + } + for(ll i=1;i<=n2;i++){ + ll l=1,r=i/2,ans=0,mid; + while(l<=r){ + mid=(l+r)/2; + ll h1=v2[mid]; + // ll h2=(v2[i]-v2[i-mid]*bp[mid]%p+p)%p; + ll h2=(v2r[i-mid+1]-v2r[i+1]*bp[mid]%p+p)%p; + printf("i=%lld, l=%lld, r=%lld, mid=%lld, h1=%lld, h2=%lld\n",i,l,r,mid,h1,h2); + if(h1==h2){ + ans=mid; + l=mid+1; + }else{ + r=mid-1; + } + } + std::cout< -#include -#include -#include -#include -using namespace std; - -using ull= unsigned long long; - -ull base = 131; -ull a[10010]; -char s[10010]; -int n, ans = 1; -int prime = 233317; -const ull mod = 212370440130137957ll; - -ull mhash(char *s) { - int len = strlen(s); - ull ans = 0; - for (int i = 0; i < len; i++) - ans = (ans * base + (ull)s[i]) % mod + prime; - return ans; -} - -int main() { - iostream::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr); - cin >> n; - for (int i = 1; i <= n; i++) { - cin >> s; - a[i] = mhash(s); - } - sort(a + 1, a + n + 1); - for (int i = 1; i < n; i++) { - if (a[i] != a[i + 1]) - ans++; - } - cout << ans << '\n'; -} \ No newline at end of file