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],S[Nrdist],gradcpy[Nrdist];
- vector<short>L[Nrdist+105];
- queue<int>Q;
- inline void Read()
- {
- fin>>k;
- fin.get();
- n=0;
- while (fin.getline(s,1001))
- {
- p=strtok(s,sep);
- ///separam textul de ,:;.!? etc
- while (p!=NULL)
- {
- 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(NULL,sep);
- }
- }
- }
- inline int Levenshtein(const char b[],const char c[])
- {
- ///dp[i][j]-numarul minim de operatii de a transforma primele i caractere din b[i]
- /// in primele j caractere din c[i]
- int X,Y,dp[Cuvmax][Cuvmax];
- 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])///move
- dp[i+1][j+1]=dp[i][j];
- }
- return dp[X][Y];
- }
- inline void Solve()
- {
- 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);
- }
- 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++) ///aflu numarul de lanturi de la nodul 1 la nodul i
- {
- int w=L[varf][j];
- S[w]+=S[varf];
- --grad[w];
- if(!grad[w])
- Q.push(w);
- }
- }
- long long sol=0;
- for(int i=1; i<=n; i++)
- if(!gradcpy[i])
- sol+=S[i]; ///in varful i se opreste lantul(varful nu mai are adiacenti)
- fout<<sol<<"\n";
- }
- int main()
- {
- Read();
- Solve();
- fin.close();
- fout.close();
- return 0;
- }
RAW Paste Data