CSES - E4590 2016 6 - Results
Submission details
Task:Dictionary
Sender:eax511
Submission time:2016-10-22 15:59:09 +0300
Language:C++
Status:READY
Result:
Test results
testverdicttime
#1--details
#20.22 sdetails
#3ACCEPTED0.05 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:48:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<v.size();++i)s[i]=v[i];
                        ^
input/code.cpp:81:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=1;i<=v.size();++i){
                         ^

Code

#include <vector>
#include <utility>
#include <algorithm>
#include <string>
#include <map>
#include <cstring>
#include <iostream>
using namespace std;
vector<int> get_suffix_array(const vector<int>&seq){
  if(seq.size()==0)return vector<int>();
  vector<int> cur = seq;
  int n = cur.size();
  for(int length = 1;;length*=2){
    vector<pair<pair<int,int>,int>> pairs(n);
    for(int i=0;i<n;++i){
      pairs[i]={{cur[i],i+length<n?cur[i+length]:-1},i};
    }
    sort(pairs.begin(),pairs.end());
    int code=0;
    for(int i=0;i<n;i++){
      if(i!=0&&pairs[i].first!=pairs[i-1].first)
        ++code;
      cur[pairs[i].second]=code;
    }
    if(code==n-1){
      vector<int> result(n);
      for(int i=0;i<n;i++)result[i]=pairs[i].second;
      return result;
    }
  }
}

int prefcmp(const char* a, const char* b){
  while(*a&&*b){
    if(*a<*b)return -1;
    if(*a>*b)return 1;
    ++a,++b;
  }
  if(*a)return 1;
  return 0;
}
typedef long long ll;

int main(){
  string v;
  cin>>v;
  vector<int> s(v.size(),0);
  for(int i=0;i<v.size();++i)s[i]=v[i];
  auto sa = get_suffix_array(s);
  int m;
  cin>>m;
  vector<map<int,ll>> cnts;
  cnts.resize(v.size()+2);
  for(int i=0;i<m;++i){
    string w;
    cin>>w;
    int a=0,b=sa.size();
    while(b-a>1){
      int c=(a+b)>>1;
      int p=prefcmp(w.c_str(),v.c_str()+sa[c]);
      if(p<0)b=c;
      else if(p>0)a=c;
      else a=c;
    }
    int u=a;
    a=0,b=u;
    while(b-a>1){
      int c=(a+b)>>1;
      int p=prefcmp(w.c_str(),v.c_str()+sa[c]);
      if(p<0)b=c;
      else if(p>0)a=c;
      else b=c;
    }
    if(prefcmp(w.c_str(),v.c_str()+sa[a])!=0)++a;
    int l=a;
    for(;l<=u;++l)++cnts[sa[l]+w.size()][sa[l]];
  }
  vector<ll> r;
  r.resize(v.size()+1);
  r[0]=1;
  for(int i=1;i<=v.size();++i){
    for(auto& it : cnts[i])r[i]=(it.second*r[it.first]+r[i])%(1000000007);
  }
  cout<<r.back()<<'\n';
  return 0;
}

Test details

Test 1

Verdict:

input
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
761942352

user output
(empty)

Test 2

Verdict:

input
vzrnezewtyyqklxcufkattywwupfdi...

correct output
7884239

user output
(empty)

Test 3

Verdict: ACCEPTED

input
trfbldmwpystlnknkjcjaxtcadqulp...

correct output
827168657

user output
827168657