Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- struct point
- {
- int choice; //сколько потомков
- int go[26]; //потомки, индекс - букква
- int pr; //предок
- };
- vector<point>v;
- int ans;
- void choice(int p) //изменить чойс всех выше точки
- {
- if(p==-1)return;
- if(v[p].choice)return;
- v[p].choice=true;
- choice(v[p].pr);
- }
- void build(int p, string s) //добавить слово s в потомки вершины p
- {
- v[p].go[s[0]-'a']=v.size();
- point x;
- x.choice=0;
- x.pr=p;
- v.push_back(x);
- for(int i=1;i<s.size();i++)
- {
- x.pr=v.size()-1;
- v[x.pr].go[s[i]-'a']=v.size();
- v.push_back(x);
- }
- v[p].choice++;
- }
- int bohr(int p, string sf,int pos=0, int l=0)
- {
- if(v[p].choice>1)l=0;
- if(pos==sf.size())
- {
- if(v[p].choice)return 0;
- return l;
- }
- if(v[p].go[sf[l]-'a'])
- return bohr(v[p].go[sf[l]-'a'],sf,pos+1,l+1);
- else
- {
- string s1;
- s1.clear();
- for(int i=pos;i<sf.size();i++)
- s1[i-pos]=sf[i];
- build(p, s1);
- if(v[p].choice>1)l=0;
- return l;
- }
- }
- int main()
- {
- if(true)
- {
- point x;
- v.push_back(x);
- }
- string s;
- while(cin>>s)
- {
- ans+=s.size()+1;
- string s1;
- s1.clear();
- int j=0;
- for(int i=0;i<s.size();i++)
- {
- //разделяем слово по знакам препинания
- if(s[i]<'a' || s[i]>'z')
- {
- int len=bohr(0,s1);
- if(len>0)ans-=len-1;
- s1.clear();
- j=0;
- }
- else
- {
- s1[j]=s[i];
- j++;
- }
- }
- if(s1.size())
- {
- int len=bohr(0,s1);
- if(len>0)ans-=len-1;
- s1.clear();
- }
- cout<<ans<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement