Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- ///
- ifstream fin("lant2.in");
- ofstream fout("lant2.out");
- const short Cuvmax=35;
- const short Nrdist=160;
- const int Pmax=1005;
- char s[Pmax], a[Nrdist][Cuvmax], *p, sep[]=" ,:;.!?-";
- int k,n, grad[Nrdist],gradcpy[Nrdist], S[Nrdist];
- vector<short> L[Nrdist+105];
- queue<int> Q;
- void Citire()
- {
- fin>>k;fin.get();
- n=0;
- while(fin.getline(s,Pmax))
- {
- p=strtok(s,sep);
- while(p)
- {
- bool ok=false;
- for(int i=1;i<=n && !ok; ++i)
- if(strcmp(p,a[i])==0) ok=true;
- if(!ok)
- {
- ++n;
- strcpy(a[n],p);
- }
- p=strtok(0,sep);
- }
- }
- }
- int Levenshtein(char b[], char c[])
- {
- int dp[Cuvmax][Cuvmax],X, Y;
- X=strlen(b);Y=strlen(c);
- ///initializari
- for(int i=0;i<=X;i++)dp[i][0]=i;
- for(int i=0;i<=Y;i++)dp[0][i]=i;
- for(int i=0;i<X;i++)
- for(int j=0;j<Y;j++)
- {
- dp[i+1][j+1]=min(1+dp[i][j+1], 1+dp[i+1][j]);
- if(b[i]==c[j] && dp[i+1][j+1]>dp[i][j]) dp[i+1][j+1]=dp[i][j];
- }
- return dp[X][Y];
- }
- void Solutie()
- {
- for(int i=1;i<n;i++)
- for(int j=i+1;j<=n;j++)
- if(Levenshtein(a[i], a[j])<=k)
- {
- ++grad[j];
- ++gradcpy[i];
- L[i].push_back(j);
- }
- ///bfs
- S[1]=1;
- for(int i=1;i<=n;i++)
- if(!grad[i])Q.push(i);
- while(!Q.empty())
- {
- int varf=Q.front();
- Q.pop();
- for(unsigned int j=0;j<L[varf].size();j++)
- {
- int w=L[varf][j];
- S[w]+=S[varf];
- --grad[w];
- if(!grad[w]) Q.push(w);
- }
- }
- ///numarare sol
- long long sol=0;
- for(int i=1;i<=n;i++)
- if(!gradcpy[i])
- sol+=S[i];
- fout<<sol;
- }
- int main()
- {
- Citire();
- Solutie();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment