#include<bits/stdc++.h>
using namespace std;
using Int = long long;

struct RollingHash{
  typedef unsigned long long ull;
  string S;
  ull B;
  Int len;
  vector<ull> hash,p;
  RollingHash(){}
  RollingHash(string S_,ull B_=1000000007LL):
    S(S_),B(B_),len(S.length()),hash(len+1),p(len+1){
    hash[0]=0;p[0]=1;
    for(Int i=0;i<len;i++){
      hash[i+1]=hash[i]*B+S[i];
      p[i+1]=p[i]*B;
    }
  }
  //S[l,r)
  ull find(Int l,Int r){
    return hash[r]-hash[l]*p[r-l];
  }
};


template<Int X>
struct Trie{
  struct Node{
    char c;
    vector<Int> nxt;
    Int idx;
    Node(char c):c(c),nxt(X,-1),idx(-1){}
  };

  using F = function<Int(char)>;
  vector<Node> v;
  F conv;
  
  Trie(F conv,char c='$'):conv(conv){v.emplace_back(c);}

  void add(const string &s,Int x){
    Int pos=0;
    for(Int i=0;i<(Int)s.size();i++){
      Int k=conv(s[i]);
      if(~v[pos].nxt[k]){
	pos=v[pos].nxt[k];
	continue;
      }
      Int npos=v.size();
      v[pos].nxt[k]=npos;
      v.emplace_back(s[i]);
      pos=npos;
    }
    v[pos].idx=x;
  }

  Int find(const string &s){
    Int pos;
    for(Int i=0;i<(Int)s.size();i++){
      Int k=conv(s[i]);
      if(v[pos].nxt[k]<0) return -1;
      pos=v[pos].nxt[k];
    }
    return pos;
  }
  
  Int find(Int pos,char c){
    return v[pos].nxt[conv(c)];
  }

  Int calc(Int pos){
    return (pos<0?pos:v[pos].idx);
  }
  
};


template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}

//INSERT ABOVE HERE
signed main(){
  string s;
  cin>>s;
  Int n;
  cin>>n;
  vector<string> p(n);
  for(Int i=0;i<n;i++) cin>>p[i];

  Trie<26>::F f=[](char c){return c-'a';};
  Trie<26> G(f);
  for(Int i=0;i<n;i++) G.add(p[i],i);

  const Int LIM = 500;
  vector<string> l;
  for(Int i=0;i<n;i++)
    if((Int)p[i].size()>=LIM) l.emplace_back(p[i]);

  Int INF = s.size()+1;
  RollingHash rh(s);
  vector<RollingHash> rhs;
  for(Int i=0;i<(Int)l.size();i++)
    rhs.emplace_back(l[i]);

  vector<Int> dp(s.size(),INF);
  for(Int i=0;i<(Int)s.size();i++){
    Int pos=0;
    for(Int j=0;j<LIM&&i+j<(Int)s.size();j++){
      pos=G.find(pos,s[i+j]);
      if(pos<0) break;
      Int k=G.calc(pos);
      if(~k){
	chmin(dp[i],i+j);
	break;
      }
    }
    for(Int j=0;j<(Int)l.size();j++){
      if(i+l[j].size()>s.size()) continue;
      if(rh.find(i,i+l[j].size())==rhs[j].find(0,l[j].size()))
	chmin(dp[i],i+(Int)l[j].size());
    }
  }
  Int ans=0,pos=INF;
  for(Int i=0;i<(Int)s.size();i++){
    //cout<<i<<":"<<pos<<" "<<dp[i]<<endl;
    chmin(pos,dp[i]);
    if(pos<=i) ans++,pos=INF;
  }
  if(pos!=INF) ans++;
  cout<<ans<<endl;
  return 0;
}

