Thank you for the assistance.  I was able to resolve the issue.  Though with .split() you also seem to need an upper limit parameter.  Took a little struggling to figure this out but here it is:

trigger AddProductstoSOW on PS_Contract__c (after insert) {
try{
for(PS_Contract__c c : Trigger.new){
    List&lt;String&gt; strProductIds = c.Initial_Services_Selected__c.split('; ', 1000);
    System.debug(strProductIds);
    List&lt;SOW_Task__c&gt; tasks = new List&lt;SOW_Task__c&gt;();
        for(String i : strProductIds){
        SOW_Task__c s = new SOW_Task__c();
        s.PS_ServiceNo__c = i;
        s.PS_Contract__c = c.Id;
        tasks.add(s);
        }
     insert tasks;
    }
}
catch(DmlException e) {
System.debug('An unexpected error has occurred: ' + e.getMessage());
}
    }


Parsing Ids from a string to create detail objects
I found myself wondering today, how much security is lost if you take a plaintext - assume that its content, including any metadata is unknown to an attacker, for example it may be random data - and encrypt it with multiple keys (not chained) and give all resulting ciphertexts to an attacker, how much higher is the probability of an attacker discovering the plaintext, vs only having a single ciphertext. 

An example:

Take plaintext $P_1$ and encrypt it with $K_1$, and send the resulting ciphertext $C_1$ to attacker $A_1$.

In addition: take the same plaintext $P_1$ and, and encrypt it with $K_1$, giving $C_1$. Then take $P_1$ and encrypt it with $K_2$ giving $C_2$, then $K_n$ giving $C_n$ and send all $n$ ciphertexts to attacker $A_2$.

How much more likely is attacker $A_2$ to discover the value of $P_1$, than $A_1$?
