# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
98895 | cfalas | Lozinke (COCI17_lozinke) | C++14 | 1068 ms | 66560 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*
______ _ _____
| ____/\ | | /\ / ____|
| |__ / \ | | / \ | (___
| __/ /\ \ | | / /\ \ \___ \
| | / ____ \| |____ / ____ \ ____) |
|_|/_/ \_\______/_/ \_\_____/
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 1000000
#define MOD 1000000007
typedef pair<ll, ll> ii;
typedef vector<ll> vi;
typedef pair<ii, ll> iii;
typedef vector<ii> vii;
#define F first
#define S second
#define mp make_pair
#define endl '\n'
#define priority_queue pq
ll modpow(ll x, ll y){
if(y==0)
return 1;
if(y==1)
return x%MOD;
ll z = modpow(x, y/2);
z = (z*z)%MOD;
if(y%2==1)
z = z*x;
return z%MOD;
}
int main(){
int n;
cin>>n;
string a[n];
string b = "";
for(int i=0;i<n;i++){
cin>>a[i];
b+=a[i];
b+="{";
}
map<ll, ll> hashes;
vector<set<int> > ans;
ans.assign(n+1, set<int>());
for(int i=0;i<n;i++){
ll hash = 0;
for(int j=0;j<a[i].size();j++)
hash = (hash*29) % MOD + (a[i][j] - 'a'+1);
//cout<<hash<<endl;
hashes[hash] ++;
}
for(int siz=1;siz<=10;siz++){
//cout<<siz<<": -------------\n";
int strcnt = 0;
int cnt=0;
ll currhash = 0;
while(cnt<siz){
if(b[cnt]=='{')
strcnt++;
currhash = currhash * 29 + (b[cnt] - 'a' + 1);
cnt++;
}
for(int i=cnt;i<b.size();i++){
//cout<<strcnt<<" "<<currhash<<endl;
if(hashes[currhash]){
ans[strcnt].insert(currhash);
}
currhash -= modpow(29, siz - 1)*(b[i-siz] - 'a' + 1);
if(currhash<0){
currhash+=MOD;
}
currhash*=29;
currhash%=MOD;
currhash += (b[i] - 'a' + 1);
if(b[i]=='{')
strcnt++;
}
if(hashes[currhash]){
ans[strcnt].insert(currhash);
}
}
int anss=0;
for(int i=0;i<=n;i++){
for(set<int>::iterator it=ans[i].begin();it!=ans[i].end();it++){
anss += hashes[(*it)];
}
}
cout<<anss-n<<endl;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |