# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
85415 | MohamedAhmed0 | Lozinke (COCI17_lozinke) | C++14 | 531 ms | 16728 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/* 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 ;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |