# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
85415 | MohamedAhmed0 | Lozinke (COCI17_lozinke) | C++14 | 531 ms | 16728 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/* Author : Mohamed Ahmed
we should sort strings according to their size
after that since that strings at most 10 letters so we can make map
to store number of times that string occur and handle case if there's strings that equal
and make another map to store number of times of substrings to handle case if there's two substrings equal
and there's string equal to them so don't count it more than one and add to answer number of strings that same
as current substring and after that increase number of times that current string appear
*/
#include <bits/stdc++.h>
using namespace std;
bool cmp(string &s , string &s1)
{
return s.size() < s1.size() ;
}
int main()
{
int n ;
cin>>n ;
string arr[n] ;
for(int i = 0 ; i < n ; ++i)
cin>>arr[i] ;
sort(arr , arr + n , cmp) ;
long long ans = 0ll ;
map<string , int>mp ;
for(int i = 0 ; i < n ; ++i)
{
string s = arr[i] ;
map<string , int>mp2 ;
ans += mp[s] ;
for(int j = 0 ; j < s.size() ; ++j)
{
string s1 = "" ;
for(int k = j ; k < s.size() ; ++k)
{
s1 += s[k] ;
if(mp2[s1] != 1)
ans += mp[s1] * 1ll ;
mp2[s1] = 1 ;
}
}
mp[s]++;
}
return cout<<ans , 0 ;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |