cf题传送门
这题用一个进制字符哈希来做会好很多哦
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
string ar;
typedef unsigned long long ull;
ull pre[N]={0};
int base=127;
ull mod=1e9+7;
int mmp[N]={0};
ull mul[N]={0};
int main()
{
cin>>ar;
pre[0]=(ull)ar[0]%mod;
int top=0;
mul[0]=1;
for(int i=0;i<ar.size();i++)
{
if(i>0)
pre[i]=(pre[i-1]*base+(ull)ar[i])%mod;
if(ar[i]=='(')
top++;
else
top--;
if(top==0)
{
mmp[i]=1;
}
if(i>0)
mul[i]=mul[i-1]*base%mod;
}
int flag=0;
for(int i=0;i<ar.size();i++)
{
if(mmp[i]!=0)
{
ull u=pre[i];
ull v=(pre[ar.size()-1]-pre[i]*mul[ar.size()-i-1]%mod+mod)%mod;
ull ttk=(v*mul[i+1]+u)%mod;
if(ttk!=pre[ar.size()-1])
{
flag=i;
break;
}
}
}
if(flag==0)
{
cout<<"no"<<endl;
return 0;
}
for(int i=flag+1;i<ar.size();i++)
cout<<ar[i];
for(int i=0;i<=flag;i++)
cout<<ar[i];
return 0;
}
还有一道洛谷的模板题
这种题目大概就是,通过将题目给出的每个字符串转分别转换成一个数字,如果有两个数字相同就说明这两个字符串相同。这种转换方法需要模拟数字进位,设置一个数字base为进率(一般我设127,质数且大小合适)再设置一个mod来求余防止爆数据(一般我设1e9+7够大且质数)接下来就迎刃而解了。
上代码:
//#include<bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<string>
#include<iostream>
using namespace std;
const int N=1e5+10;
typedef unsigned long long ull;
string ar;
int base=123;
ull mod=965874321;
ull br[N]={0};
ull hashs(string cr)
{
ull tt=0;
for(int i=0;i<cr.size();i++)
{
tt=(tt*base+(ull)cr[i])%mod;
}
return tt&0x7fffffff;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>ar;
br[i]=hashs(ar);
}
sort(br,br+n);
int ans=0;
for(int i=1;i<n;i++)
{
if(br[i]==br[i-1])
ans++;
}
cout<<n-ans<<endl;
return 0;
}